45

Можно ли использовать GNU grep для получения подходящей группы из выражения?

Пример:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Который вывел бы "бар". Но я хотел бы получить просто "бар", без необходимости отправлять его через grep еще раз (то есть получить соответствующую группу). Это возможно?

3 ответа3

48

Вы можете использовать sed для этого. На BSD sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

Или без опции -E :

sed "s/.*'\([^']\+\)'.*/\1/"

Это не работает для многострочного ввода. Для этого вам нужно:

sed -n "s/.*'\([^']\+\)'.*/\1/p"
26

Хотя grep не может выводить определенную группу, вы можете использовать прогнозирование и утверждения позади, чтобы добиться того, что вы после:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

2

Вы можете использовать \K для сброса и отбрасывания текста совпадения с левой стороны вместе с заглядыванием, которое не добавляется в текст совпадения:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

GNU grep only.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .