Ist es möglich, GNU grep zu verwenden, um eine übereinstimmende Gruppe aus einem Ausdruck zu erhalten?
Beispiel:
echo "foo 'bar'" | grep -oE "'([^']+)'"
Welches würde "'bar'" ausgeben. Aber ich möchte nur "bar" bekommen, ohne es noch einmal durch grep senden zu müssen (dh die passende Gruppe bekommen). Ist das möglich?
( ) +
Einsatz\( \) \+
: Dies ist effektiv gleich:sed "s/.*'\([^']\+\)'.*/\1/"
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Grep kann zwar keine bestimmte Gruppe ausgeben, Sie können jedoch Lookahead- und Behind-Assertions verwenden, um das zu erreichen, wonach Sie suchen:
quelle
grep -P
ist nicht auf allen Plattformen verfügbar. Aber wenn ja, ist die Verwendung von Lookahead / Behind eine sehr gute Möglichkeit, das Problem zu lösen.Sie können
\K
den linken Match-Text zusammen mit einem Lookahead, der nicht zum Match-Text hinzugefügt wird, zurücksetzen und verwerfen:Nur GNU grep.
quelle