Можно ли использовать GNU grep для получения подходящей группы из выражения?
Пример:
echo "foo 'bar'" | grep -oE "'([^']+)'"
Который вывел бы "бар". Но я хотел бы получить просто «бар», без необходимости отправлять его через grep еще раз (т.е. получить соответствующую группу). Это возможно?
grep
'-E: «Регулярные выражения интерпретируются как расширенные (современные) регулярные выражения, а не как базовые регулярные выражения (BRE). Страница справочника re_format (7) полностью описывает оба формата».( ) +
использования\( \) \+
: это фактически то же самое:sed "s/.*'\([^']\+\)'.*/\1/"
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Хотя grep не может вывести конкретную группу, вы можете использовать прогнозирование и утверждения позади, чтобы добиться того, что вы после:
источник
grep -P
доступно не на всех платформах. Но если это так, использование lookahead / behind - очень хороший способ решения проблемы.Вы можете использовать
\K
для сброса и отбрасывания текста совпадения левой руки вместе с предвкушением, которое не добавляется в текст совпадения:GNU grep only.
источник