2016-07-25 33 views
0

Eingabezeichenfolgen sind wie folgt.Wie teilt man den Versions-Wert mit sed?

6.5.1.2.3 
6.10.3.9.6 
7.2.0.0.0 
10.11.12.13.4 

Und ich mag zunächst zweistelliger extrahieren und aus jener Zeit ersetzen zu unterstreichen

6_5 
6_10 
7_2 
10_11 

sed Verwendung Als ich benutzen:

sed 's/\./_/g' | cut -c 1-3 

6_10, 10_11 Ergebnis nicht korrekt war.

Gibt es Arbeit hier?

Antwort

4

awk ist auch nützlich für solche Dinge. Wenn Sie die Ausgabe Feldtrenn gesetzt OFS:

$ awk -F"." -v OFS="_" '{print $1, $2}' file 
6_5 
6_10 
7_2 
10_11 

Aber wenn Sie wirklich sed Referenzen verwenden zurück müssen (hier mit erweiterten regulären Ausdrücken - beachten Sie, dass die Option manchmal -E ist und manchmal nur grundlegende reguläre Ausdrücke unterstützt werden durch sed) :

$ sed -r 's/([0-9]+)\.([0-9]+).*/\1_\2/' file 
6_5 
6_10 
7_2 
10_11 

Wenn Sie an Ort und Stelle durchführen möchten ersetzen, entweder Sie awk/sed '...' file > tmp_file && mv tmp_file file oder verwenden sed -i (auf diesen Plattformen sagen kann, wo sie unterstützt wird, aber beachten Sie, dass es Unterschiede zwischen GNU 012.325.und BSD (macOS) sed) oder gawk -i inplace (GNU Awk).

Hinweis: In beiden Fällen verwende ich einen einzigen Befehl, anstatt einen anderen Befehl zu verwenden.

+1

Sie könnten ein verwenden portabler '-E' Option anstelle von' -r'. –

+0

@ Jonathan vielen Dank für Ihre gründlichen Änderungen, um die Links zu Docs zu entfernen. – fedorqui

1

Sie sind fast da:

echo 1.2.3.4 | sed 's/\./_/g' | cut -d "_" -f1,2 

(Entkommen der Punkt mit \ und spezifiziert das Trennzeichen für cut.)

1

Der Eingang ist so einfach, kann es leicht mit nur cut und tr erfolgen . Verwenden Sie cut, um die ersten beiden Felder auswählen (begrenzt durch .) und dann tr verwenden Sie den Punkt in einen Unterstrich zu ändern:

$ cut -d '.' -f 1,2 input | tr '.' '_' 
6_5 
6_10 
7_2 
10_11 
+0

Warum würden Sie zwei Prozesse verwenden, wenn es bereits eine einfachere, besser erklärte Antwort mit einem gibt. – 123

+0

@ 123 Ich versuche generell, Werkzeuge zu verwenden, die entwickelt wurden, um das zu tun, wofür ich sie verwende. Sowohl "sed" als auch "awk" fühlten sich etwas zu allgemein an. Dies ist auch viel schneller als 'sed' oder' awk' ('sed' ist bei weitem die langsamste Lösung). – Kusalananda

+0

@Kusalanda, wie kommst du zu dem Schluss, dass das schneller ist? Wie sind sed und awk nicht darauf ausgelegt, Text zu manipulieren? – 123

0

Meine awk Lösung wäre:

$ echo "6.5.1.2.3 
> 6.10.3.9.6 
> 7.2.0.0.0 
> 10.11.12.13.4" | awk 'BEGIN{FS=".";OFS="_"}{print $1,$2}' 
6_5 
6_10 
7_2 
10_11