sed: Nur passende Gruppe drucken
Möchte ich zu greifen, die letzten zwei zahlen (int, float, gefolgt von optionalen Leerzeichen) und nur drucken.
Beispiel:
foo bar <foo> bla 1 2 3.4
Drucken:
2 3.4
Bisher habe ich die folgenden:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
mir
foo bar <foo> bla 1 replacement
Allerdings, wenn ich versuche, Sie zu ersetzen mit der Gruppe 1, die ganze Zeile wird gedruckt.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
Wie kann ich drucken Sie nur den Abschnitt der Linie entspricht der regex in der Gruppe?
InformationsquelleAutor der Frage mort | 2013-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Match der ganzen Linie, so fügen Sie eine
.*
am Anfang des regex. Dies bewirkt, dass die gesamte Leitung ersetzt werden, die mit dem Inhalt der GruppeInformationsquelleAutor der Antwort iruvar
grep ist das richtige Werkzeug für das extrahieren.
mit Ihrem Beispiel und Ihrer regex:
InformationsquelleAutor der Antwort Kent
Und für noch eine andere Möglichkeit, würde ich gehen mit awk!
Dies wird teilen Sie die input - (ich bin mit STDIN hier, aber Ihr Eingang kann leicht ein-Datei) auf Räume, und drucken Sie dann die Letzte-aber-ein Feld, und dann das Letzte Feld. Die
$NF
Variablen halten Sie die Anzahl der Felder, die nach explodieren zu Räumen.Der Vorteil dabei ist, dass es egal ist, wenn das, was vor den letzten beiden Felder ändert, solange Sie nur immer wollen, dass die letzten beiden es werden weiterhin funktionieren.
InformationsquelleAutor der Antwort chooban
Den Befehl Ausschneiden ist konzipiert für exakt diese situation. Es wird "geschnitten" auf ein beliebiges Trennzeichen und dann können Sie angeben, welche Stücke ausgegeben werden soll.
Zum Beispiel:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Folge in der Ausgabe von:
2 3.4
-d setzt das Trennzeichen
-f wählt den Bereich der 'Felder' - Ausgabe, in diesem Fall ist es der 6. bis 7. Abschnitte der ursprünglichen Zeichenfolge.
InformationsquelleAutor der Antwort carlin.scott