Как найти все слово с помощью grep

87

Я использую следующую команду для поиска в подкаталогах

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

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

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

ИЛИ в этом отношении .... также находит <s:text somethingElse="lkjkj" name="lkkj"

в основном s:textи nameдолжны быть на одной линии ....

Джош
источник
29
Кто-нибудь читал заголовок как «как grep для всего мира »?
Earlz
15
@Earlz, нет, в основном потому, что я погуглил "grep all word".
Люк,

Ответы:

104

Вы хотите, чтобы -wпараметр указывал, что это конец слова.

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

Дерек Х
источник
71

Используется \bдля сопоставления по «границам слов», что позволяет выполнять поиск только по целым словам.

Итак, ваш grep будет выглядеть примерно так

grep -r "\bSTRING\b"

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

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

Из http://www.regular-expressions.info/wordboundaries.html :

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

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один символ слова, а другой не символ слова.
cs01
источник
28

Вы можете отбросить xargsкоманду, выполнив поиск с помощью grep рекурсивно. И обычно флаг 's' не нужен. Отсюда:

grep -wr 's:text' 
шутник
источник
1

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

rg -w 's:text' . 

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

мс4720
источник
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из обзора
Jibin Balachandran
4
Я дал ответ: rg -w 's: text'.
ms4720 01
1
Могут быть и другие причины для предложения нестандартного инструмента, но в качестве решения вопроса о том, как решить эту проблему с помощью стандарта, grepэто не особенно убедительно или удовлетворительно, особенно с учетом того, что у grepнего есть такая же опция.
Tripleee
Это зависит от того, насколько глубока и
жирна директива
Это зависит от количества файлов, ripgrep может быть намного быстрее, а find-> xargs создает новый процесс для каждого файла.
ms4720
0

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

xargs grep -s 's:text '

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

Стефан Кендалл
источник
что, если «текст» находится в конце вывода? Не будет ли это пропущено в вашем решении?
pkuszewski