![Grep полное имя, включая точку в слове](https://rvso.com/image/154442/Grep%20%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B5%20%D0%B8%D0%BC%D1%8F%2C%20%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%8F%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B5.png)
В 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:]]*\)'