Як згрібати ціле слово


87

Я використовую наступну команду для grep речей у піддиректоріях

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

Однак це також знаходить такі речі <s:textfield name="sdfsf"...../>

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

АБО з цього приводу .... також знаходить <s:text somethingElse="lkjkj" name="lkkj"

в основному s:textі nameповинен бути на одній лінії ....


29
Хто-небудь читав заголовок як "як гребти на цілий світ "?
Earlz,

15
@Earlz, ні, здебільшого тому, що я погуглив "grep whole 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' . 

повинен це зробити


Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Джибін Балачандран

4
Я дав відповідь: rg -w 's: text'.
ms4720

1
Можуть бути й інші причини пропонувати нестандартний інструмент, але як вирішення питання про те, як вирішити це за допомогою стандарту, grepце не є особливо переконливим або задовольняючим, особливо з огляду на те, що grepмає такий самий варіант.
триплеє

Це залежить від того, наскільки глибоким і жирним є директіс
ms4720

Це залежить від кількості файлів, 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.