Чи може GNU Grep вивести вибрану групу?


47

Чи можна використовувати GNU grep, щоб отримати відповідну групу з виразу?

Приклад:

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

Який би виводив "" бар "". Але я хотів би отримати просто "смугу", без необхідності пересилати її через grep ще раз (тобто отримати відповідну групу). Це можливо?

Відповіді:


50

Ви можете використовувати sedдля цього. На BSD sed:

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

Або без -Eопції:

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

Це не працює для багаторядкового введення. Для цього вам потрібно:

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

Спасибі, забув про sed. Але для уточнення, sed не бере аргументу -E ..
Torandi

Гм, це робиться на моїй машині (Mac OS X). Після подальшого вивчення на вхідній сторінці: "Параметри -E, -a та -i є нестандартними розширеннями FreeBSD і можуть бути недоступні для інших операційних систем."
jtbandes

1
-r мені здається, що це.
Торанді

1
@jtbandes: Вам не потрібні розширені можливості для цього виразу .. Я просто вимагає 3 керуючих символів для ( ) +використання \( \) \+: Це фактично те ж саме:sed "s/.*'\([^']\+\)'.*/\1/"
Peter.O

2
Це не працює для багаторядкового введення. Для цього вам потрібно: sed -n "s/.*'\([^']\+\)'.*/\1/p"
freakhead

28

Хоча grep не може вивести певну групу, ви можете використовувати твердження lookahead і позаду, щоб досягти того, що буде після:

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


8
grep -Pдоступний не на всіх платформах. Але якщо це так, використання lookahead / позаду - це дуже приємний спосіб вирішення проблеми.
Себастьян

1
Чи є греп інтелігентним щодо заперечень тверджень? Як це виглядає з довгими оглядами? Чи інтегрує це вигляд у якесь «суфіксне дерево» з рештою виразів?
Росс Роджерс

3

Ви можете скористатися \Kдля скидання та відкидання тексту матчу лівої руки разом із записом, який не додається до тексту відповідності:

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

GNU grep only.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.