![Sed-Capture-Gruppen funktionieren nicht](https://rvso.com/image/83666/Sed-Capture-Gruppen%20funktionieren%20nicht.png)
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/g
um die erste Zahl abzurufen, sed "s/\([0-9]*\)/\2/g
die zweite Zahl abzurufen und sed "s/\([0-9]*\)/\3/g
die 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 foo
wird sein \1
, bar
wird sein \2
und baz
wird 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 \2
nicht 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