Sed-Capture-Gruppen funktionieren nicht

Sed-Capture-Gruppen funktionieren nicht

Ich habe einen String im Format [0-9]+\.[0-9]+\.[0-9]. Ich muss die erste, zweite und dritte Zahl separat extrahieren. So wie ich es verstehe, sollten Erfassungsgruppen dazu in der Lage sein. Ich sollte in der Lage sein, zu verwenden, sed "s/\([0-9]*\)/\1/gum die erste Zahl abzurufen, sed "s/\([0-9]*\)/\2/gdie zweite Zahl abzurufen und sed "s/\([0-9]*\)/\3/gdie dritte Zahl abzurufen. In jedem Fall erhalte ich jedoch den gesamten String. Warum passiert das?

Antwort1

Wir können Ihnen keine vollständige Antwort geben, ohne ein Beispiel Ihrer Eingabe, aber ich kann Ihnen sagen, dass Ihr Verständnis von Erfassungsgruppen falsch ist. Sie verwenden sie nicht sequenziell, sie beziehen sich nur auf den regulären Ausdruck auf der linken Seite desselben Substitutionsoperators. Wenn Sie beispielsweise erfassen, /(foo)(bar)(baz)/dann foowird sein \1, barwird sein \2und bazwird sein \3. Sie können nicht tun s/(foo)/\1/; s/(bar)/\2/, da es im zweiten s///Aufruf nur eine erfasste Gruppe gibt und daher \2nicht definiert wird.

Um Ihre drei Zifferngruppen zu erfassen, müssen Sie also Folgendes tun:

sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'

Oder, besser lesbar:

sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'

Antwort2

Beispiel:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78

Oder alle zusammen:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78

Antwort3

Verwenden Sie Sed mit -r, --regexp-extended, um alle maskierten Klammern zu vermeiden.

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/' 
1234, 567, 89    #output

verwandte Informationen