Может ли GNU Grep выводить выбранную группу?
Можно ли использовать GNU grep для получения согласованной группы из выражения?
Пример:
echo "foo 'bar'" | grep -oE "'([^']+)'"
Что будет выводить «bar». Но я хотел бы получить только «бар», не отправляя его через grep еще раз (т. Е. Получить согласованную группу). Возможно ли это?
3 ответа
46
Для этого вы можете использовать sed
. В BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
Или без опции -E
:
sed "s/.*'\([^']\+\)'.*/\1/"
Это не работает для многострочного ввода. Для этого вам нужно:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
ответил jtbandes 23 J000000Thursday09 2009, 03:30:39
26
В то время как grep не может выводить определенную группу, вы можете использовать lookahead и за утверждениями, чтобы добиться того, что было после:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
ответил Aldrik 11 Jam1000000amWed, 11 Jan 2012 03:33:57 +040012 2012, 03:33:57
2
Вы можете использовать \K
, чтобы сбросить и отменить текст соответствия левой руки вместе с lookahead, который не добавлен в текст соответствия:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
Только GNU grep.
ответил drewk 27 FebruaryEurope/MoscowbMon, 27 Feb 2017 21:15:29 +0300000000pmMon, 27 Feb 2017 21:15:29 +030017 2017, 21:15:29