Как grep для всего слова


Я использую следующую команду, чтобы команда grep вещи в подкаталоги

find . | xargs grep -s 's:text'

однако, это также находит такие вещи, как <s:textfield name="sdfsf"...../>

что я могу сделать, чтобы избежать этого, поэтому он просто находит вещи, как <s:text name="sdfsdf"/>

или если уж на то пошло....и находит <s:text somethingElse="lkjkj" name="lkkj"

в принципе s:text и name должно быть на той же линии....

5   51   2010-05-21 05:41:49

5 ответов:

вы хотите -w возможность указать, что это конец слова.

find . | xargs grep -sw 's:text'

использовать \b чтобы соответствовать на "границы слов", который сделает ваш поиск совпадение только на целые слова.

Так что ваш grep будет выглядеть что-то вроде

grep -r "\bSTRING\b"

добавление цвета и номера строк тоже может помочь

grep --color -rn "\bSTRING\b"

от http://www.regular-expressions.info/wordboundaries.html:

есть три различных позиции, которые квалифицируются как границы слова:

  • перед первым символ в строке, если первый символ является слово характер.
  • после последнего символа в строке, если последний символ-это символ слова.
  • между двумя символами в строке, где один - это символ слова, а другой-не символ слова.

вы можете отбросить xargs команда, делая поиск grep рекурсивно. И вам обычно не нужен флаг "s". Таким образом:

grep -wr 's:text' 

если вы просто хотите отфильтровать остальная часть текста, вы можете сделать это.

xargs grep -s 's:text '

это должно найти только s:text экземпляры с пробелом после последнего t. Если вам нужно найти s:text экземпляры, которые имеют только элемент name, либо передают ваши результаты другому grep выражение, или использовать регулярное выражение для фильтрации только необходимые элементы.

вы можете попробовать rg,https://github.com/BurntSushi/ripgrep:

rg -w 's:text' . 

должны сделать это