Как найти все слово с помощью 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 :

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

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

28

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

grep -wr 's:text' 

1

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

rg -w 's:text' . 

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


Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из обзора
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.