Ich möchte die letzten beiden Zahlen (eine int, eine float; gefolgt von einem optionalen Leerzeichen) abrufen 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?
-r
Option "--regexp-extended" hinzufügen, da sonstinvalid reference \1 on
der RHS-Fehler des Befehls s angezeigt wurde .(
und)
anstelle von\(
und verwenden\)
..*
Denken Sie auch daran, am Ende des regulären Ausdrucks hinzuzufügen , wenn sich die zu extrahierende Zeichenfolge nicht immer am Ende der Zeile befindet..*
es gierig ist und sed keine nicht gierige hat.*?
(
und)
werde in Ubuntu 16.04 keinen Fehler auslösen. Ich denke, dieser Kommentar ist veraltet.grep ist das richtige Werkzeug zum Extrahieren.
Verwenden Sie Ihr Beispiel und Ihren regulären Ausdruck:
quelle
grep -o
Aufrufen extrahieren . stackoverflow.com/a/58314379/117471Und für eine weitere Option würde ich mit awk gehen!
Dadurch wird die Eingabe (ich verwende hier STDIN, aber Ihre Eingabe könnte leicht eine Datei sein) auf Leerzeichen aufgeteilt und dann das vorletzte Feld und dann das letzte Feld ausgedruckt. Das
$NF
Variablen enthalten die Anzahl der Felder, die nach dem Auflösen von Leerzeichen gefunden wurden.Dies hat den Vorteil, dass es keine Rolle spielt, ob sich das, was den letzten beiden Feldern vorausgeht, ändert, solange Sie nur die letzten beiden Felder möchten, funktioniert es weiterhin.
quelle
Der Befehl cut ist genau für diese Situation ausgelegt. Es wird auf jedem Trennzeichen "geschnitten" und dann können Sie angeben, welche Chunks ausgegeben werden sollen.
Zum Beispiel:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Wird zur Ausgabe von:
2 3.4
-d setzt das Trennzeichen
-f wählt den Bereich der auszugebenden 'Felder' aus. In diesem Fall ist dies der 6. bis 7. Block der ursprünglichen Zeichenfolge. Sie können den Bereich auch als Liste angeben, z
6,7
.quelle
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Ich stimme @kent zu, dass dies gut geeignet ist
grep -o
. Wenn Sie eine Gruppe innerhalb eines Musters extrahieren müssen, können Sie dies mit einem zweiten Grep tun.quelle