Как найти полные слова между пробелами? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть набор текстовых файлов и набор ключевых слов, которые мне нужно найти в этих файлах.Однако меня интересует только сопоставление «полных слов», то есть строк между пустыми пространствами.Так, например, если у меня есть текст

line1: word1 word2,
line2: word3 word22
line3: word4 aword2

, я хочу получить только строку 1, но не 2 или 3, если я ищу word2.Кроме того, мне нужно знать строку, где произошло совпадение, поэтому я не могу превратить каждый текстовый файл в пакет слов и искать там.

Могу ли я использовать grep для этого?Если так, то как?Или есть лучшие альтернативы?

Кроме того, будет ли это работать, если я хочу вместо этого искать фразу, например,

line1: word1 word word2,
line2: word3 word word22
line3: word4 wword word2

должен выдавать только строку1, если я хочу найти словоword2"

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Здесь у вас есть grep для всех его опций:

-w, --word-regexp: выберите только те строки, которые содержат совпадения, образующие целые слова. Тест состоит в том, что соответствующая подстрока должна быть либо в начале строки, либо предшествовать не состоящему из слова символу. Точно так же он должен быть либо в конце строки, либо следовать за символом, не входящим в состав слова. Составляющие слова символы - это буквы, цифры и подчеркивание.

источник: man grep

$ grep -w word2 file
1 голос
/ 02 апреля 2019

Я думаю, что вы ищете что-то вроде

grep -E "(^|\W)word2($|\W)" mytestfile.txt

То же самое должно работать и для вашего второго сценария

grep -E "(^|\W)word word2($|\W)" mytestfile.txt

-E для расширенного регулярного выражения (egrep),(^ | \ W) будет соответствовать началу строки или не алфавитно-цифровому символу (^ a-zA-Z0-9).($ | \ W) будет соответствовать концу строки или не-буквенно-цифровому символу.

Я проверял это на OSX, но я думаю, что это будет работать в основном на любой системе (GNU Grep имеет -Eвариант тоже).

0 голосов
/ 27 апреля 2019

Осторожно, пользователи pcre2grep! Использование параметра -w или \ W в регулярном выражении плохо работает с символами с акцентом. Например, использование «(^ | \ W) class ($ | \ W)» приводит к тому, что следующие 2 строки также сопоставляются:

"Verset déclassé",

"Segment de verset déclassé",

Как видно из этого примера, ударение на е не считается словообразующим символом.

(Примечание: я использую pcre2grep 1022 - GNU grep 2.0d)

...