412 Stimmen

Wie kann ich mit sed nur erfasste Gruppen ausgeben?

Gibt es eine Möglichkeit zu sagen sed um nur erfasste Gruppen auszugeben?

Zum Beispiel, wenn die Eingabe gegeben ist:

This is a sample 123 text and some 987 numbers

Und Muster:

/([\d]+)/

Könnte ich nur 123 und 987 in der durch Rückverweise formatierten Form ausgeben lassen?

11voto

Joseph Quinsey Punkte 9185

Ich glaube, das in der Frage angegebene Muster diente nur als Beispiel, und das Ziel war es, eine Übereinstimmung mit jede Muster.

Wenn Sie eine sed mit der GNU-Erweiterung, die das Einfügen eines Zeilenumbruchs in den Musterbereich erlaubt, ist ein Vorschlag:

> set string = "This is a sample 123 text and some 987 numbers"
>
> set pattern = "[0-9][0-9]*"
> echo $string | sed "s/$pattern/\n&\n/g" | sed -n "/$pattern/p"
123
987
> set pattern = "[a-z][a-z]*"
> echo $string | sed "s/$pattern/\n&\n/g" | sed -n "/$pattern/p"
his
is
a
sample
text
and
some
numbers

Diese Beispiele sind mit tcsh (ja, ich wissen es ist die falsche Shell) mit CYGWIN. (Edit: Für die Bash entfernen Sie set und die Leerzeichen um =).

5voto

eskogh Punkte 31

Sie müssen die ganze Zeile einschließen, um die Gruppe zu drucken, was Sie beim zweiten Befehl tun, aber Sie müssen den ersten Platzhalter nicht gruppieren. Dies wird auch funktionieren:

echo "/home/me/myfile-99" | sed -r 's/.*myfile-(.*)$/\1/'

4voto

Bert F Punkte 81431

Versuchen Sie

sed -n -e "/[0-9]/s/^[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*$/\1 \2 \3 \4 \5 \6 \7 \8 \9/p"

Ich habe dies unter Cygwin:

$ (echo "asdf"; \
   echo "1234"; \
   echo "asdf1234adsf1234asdf"; \
   echo "1m2m3m4m5m6m7m8m9m0m1m2m3m4m5m6m7m8m9") | \
  sed -n -e "/[0-9]/s/^[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*$/\1 \2 \3 \4 \5 \6 \7 \8 \9/p"

1234
1234 1234
1 2 3 4 5 6 7 8 9
$

3voto

Thomas Bratt Punkte 43640

Es ist nicht das, wonach der OP gefragt hat (Erfassung von Gruppen), aber Sie können die Zahlen mit extrahieren:

S='This is a sample 123 text and some 987 numbers'
echo "$S" | sed 's/ /\n/g' | sed -r '/([0-9]+)/ !d'

Gibt das Folgende an:

123
987

2voto

Sida Zhou Punkte 3051

Ich möchte ein einfacheres Beispiel für die "Ausgabe nur erfasster Gruppen mit sed" geben

Ich habe /home/me/myfile-99 und die Seriennummer der Datei ausgeben möchten: 99

Mein erster Versuch, der nicht funktionierte, war:

echo "/home/me/myfile-99" | sed -r 's/myfile-(.*)$/\1/'
# output: /home/me/99

Damit dies funktioniert, müssen wir auch den unerwünschten Teil in der Erfassungsgruppe erfassen:

echo "/home/me/myfile-99" | sed -r 's/^(.*)myfile-(.*)$/\2/'
# output: 99

*) Beachten Sie, dass sed nicht über \d

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X