Grep полное имя, включая точку в слове

Grep полное имя, включая точку в слове

В kshскрипте оболочки я использую grepкоманду для получения определенного слова, как показано ниже.

$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst

$ grep -o "\wdef\w" file.txt
xyzdef
def

Я хочу, чтобы вывод был xyzdef.123иdef.jkl

Он не извлекает значение после .Есть ли другой способ получить grepэто слово также Я не знаю точное слово, grepтолько я знаю шаблон. Я работаю над kshоболочкой.

решение1

Похоже, вам нужна только строка defи все непробельные символы вокруг нее. Если так, вы можете использовать:

$ grep -Eo '\S*def\S*' file.txt 
xyzdef.123
def.jkl

Символ \Sозначает отсутствие пробелов и поддерживается GNU grepс флагами -Eили -P.

решение2

Использование grep -oклассов символов POSIX:

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

Это по сути то, чтотердон предполагает, хотя и с использованием немного другого синтаксиса (и без -E). Это будет соответствовать строке defи любым непустым символам по обе стороны от этой строки (непустой символ — это символ, который не является пробелом или табуляцией).

В качестве альтернативы,

tr '[:blank:]' '\n' <file | grep -F 'def'

Это просто разбивает строку на несколько строк, по одной строке на слово, разделенное пробелами (где «пробел» — это символ табуляции или пробела). Затем он применяет простое сопоставление строк к grep -Fсгенерированным строкам, чтобы найти те, которые вас интересуют.


Ваш шаблон, \wdef\w, который с GNU grep, если используются имена классов символов POSIX, такой же, как [[:alnum:]_]def[[:alnum:]_], требует, чтобы строка defбыла окружена буквенно-цифровым символом или подчеркиванием с обеих сторон. Точка не является ни буквенно-цифровым символом, ни подчеркиванием.

Шаблон также не будет совпадать def, если он встречается в самом начале или конце строки.

решение3

При вашей попытке вы не можете сопоставить целое слово, которое будет возвращено. Флаг -oвозвращает grepтолько определенную сопоставленную часть регулярного выражения. Также \wне является расширением, определенным POSIX, grepи может быть доступен только в версиях GNU, которые поддерживают синтаксис PCRE. На котором вы могли бы сделать

grep -oP '(\w*)def[.](\w*)'

Флаг -Pвключает режим регулярных выражений PCRE в GNU, grepи -oфлаг возвращает целое слово, соответствующее определенному регулярному выражению. Регулярное выражение переводится как совпадение нуля или более буквенно-цифровых символов, за которыми следует defлитерал .(заключенный в квадратное выражение), за которым следует ноль или более буквенно-цифровых символов.

Использование классов символов POSIX для буквенно-цифровых символов будет сделано ниже. Но помните, что флаг -oвсе еще является расширением GNU

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

Связанный контент