Grep - как вывести только содержимое группы захвата - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь найти способ для grep выводить только содержимое группы захвата. Например, если у меня есть следующий файл:

hello1, please match me
hello2, please do not match me

Я бы хотел

grep -Eo '(hello[0-9]+), please match me' file

Вывести hello1. Однако он выдает hello1, please match me.

Теперь я знаю, что grep -Po 'hello[0-9]+(?=, please match me)' справится, но я думаю, что должен быть способ просто вернуть группу захвата, но я не смог найтиинформация (в сети и в man grep).

Возможно ли это, или группы захвата предназначены только для обратной ссылки? Мне было бы странно, если бы не было никакого способа сделать это.

Спасибо за ваше время и не стесняйтесь критиковать способ, которым этот пост построен!

Ответы [ 4 ]

1 голос
/ 14 октября 2019

Если у вас есть pcregrep или pcre2grep, вы можете использовать флаг командной строки -o1, чтобы запросить вывод только группы захвата 1. (Или измените 1 на другое число, если в регулярном выражении больше перехватов.)

Вы можете использовать команду -o<i>N</i> более одного раза, если хотите вывести более одной группы перехвата.

Насколько я знаю, grep -P не реализует это расширение. Вы найдете pcre2grep в пакете Debian / Ubuntu pcre2-utils. pcregrep в упаковке pcregrep.

1 голос
/ 14 октября 2019

Существует сложный способ с режимом Perl

$ echo "hello1, please match me" | rev | grep -oP 'em hctam esaelp ,\K[0-9]olleh' | rev
hello1

, в основном с использованием \K lookbehind путем изменения условий ввода и поиска.

Вы можете перевести поиск в обратном порядке в rev а также.

$ echo hello1, please match me | 
  rev | 
  grep -oP "$(echo hello1K\\, please match me | rev)" | 
  rev
1 голос
/ 14 октября 2019

Просто версия awk.

awk -F, '/hello[0-9]+, please match me/ {print $1}' file
hello1
1 голос
/ 14 октября 2019

Этот вопрос был задан десять лет назад , поэтому я не буду отмечать его как дубликат. Также я заметил, что решение sed не было дано, так как OP спросил ответ без:

sed -nr 's/(hello[0-9]+), please match me/\1/p' test.txt
  • -n означает «тихий» (ничего не печатать, кроме как в явном виде)
  • -r позволяет использовать расширенные регулярные выражения (здесь не используется \ перед скобками)
  • s/reg/repl/p команда означает "еслирегулярное выражение reg соответствует текущей строке, замените ее захваченным текстом на repl и напечатайте его (/p) "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...