Может ли GNU Grep выводить выбранную группу?

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

Пример:

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

Что будет выводить «bar». Но я хотел бы получить только «бар», не отправляя его через grep еще раз (т. Е. Получить согласованную группу). Возможно ли это?

42 голоса | спросил Torandi 23 J000000Thursday09 2009, 03:26:04

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

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132