it-swarm.com.de

sed: Nur passende Gruppe drucken

Ich möchte die letzten beiden Zahlen (eine Ganzzahl, eine Gleitkommazahl, gefolgt von optionalem Leerzeichen) erfassen und nur diese drucken.

Beispiel:

foo bar <foo> bla 1 2 3.4

Sollte drucken:

2 3.4

Bisher habe ich folgendes:

sed -n  's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p' 

wird mir geben

foo bar <foo> bla 1 replacement

Wenn ich jedoch versuche, es durch Gruppe 1 zu ersetzen, wird die gesamte Zeile gedruckt.

sed -n  's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p' 

Wie kann ich nur den Abschnitt der Zeile drucken, der dem regulären Ausdruck in der Gruppe entspricht?

112
mort

Passen Sie die gesamte Zeile an, fügen Sie also ein .* am Anfang Ihres regulären Ausdrucks. Dadurch wird die gesamte Zeile durch den Inhalt der Gruppe ersetzt

echo "foo bar <foo> bla 1 2 3.4" |
 sed -n  's/.*\([0-9][0-9]*[\ \t][0-9.]*[ \t]*$\)/\1/p'
2 3.4
116
iruvar

grep ist das richtige Werkzeug zum Extrahieren.

verwenden Sie Ihr Beispiel und Ihren regulären Ausdruck:

kent$  echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$'
2 3.4
60
Kent

Und für eine weitere Option würde ich awk wählen!

echo "foo bar <foo> bla 1 2 3.4" | awk '{ print $(NF-1), $NF; }'

Dies teilt die Eingabe (ich verwende hier STDIN, aber Ihre Eingabe könnte leicht eine Datei sein) in Leerzeichen auf und druckt dann das vorletzte Feld und dann das letzte Feld aus. Das $NF Variablen enthalten die Anzahl der Felder, die nach der Explosion in Leerzeichen gefunden wurden.

Dies hat den Vorteil, dass es keine Rolle spielt, ob sich vor den letzten beiden Feldern Änderungen ergeben, solange Sie immer nur die letzten beiden Felder verwenden möchten.

9
chooban

Der Befehl cut ist genau für diese Situation ausgelegt. Es wird an jedem Begrenzer "abgeschnitten" und Sie können dann angeben, welche Blöcke ausgegeben werden sollen.

Zum Beispiel: echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7

Es wird ausgegeben von: 2 3.4

-d legt das Trennzeichen fest

-f wählt den Bereich der auszugebenden 'Felder' aus. In diesem Fall handelt es sich um den 6. bis 7. Block der ursprünglichen Zeichenfolge. Sie können den Bereich auch als Liste angeben, z. B. 6,7.

3
carlin.scott