Ich habe eine Zeichenfolge des Formats [0-9]+\.[0-9]+\.[0-9]
. Ich muss die erste, zweite und dritte Zahl separat extrahieren. Soweit ich weiß, sollten Fanggruppen dazu in der Lage sein. Ich sollte in der Lage sein sed "s/\([0-9]*\)/\1/g
, die erste Nummer sed "s/\([0-9]*\)/\2/g
zu bekommen, die zweite Nummer sed "s/\([0-9]*\)/\3/g
zu bekommen und die dritte Nummer zu bekommen. In jedem Fall bekomme ich aber die ganze Saite. Warum passiert dies?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
einzelne Nummern zu erfassen.Antworten:
Ohne ein Beispiel für Ihre Eingabe können wir Ihnen keine vollständige Antwort geben, aber ich kann Ihnen sagen, dass Ihr Verständnis von Erfassungsgruppen falsch ist. Sie werden nicht nacheinander verwendet, sondern beziehen sich nur auf den regulären Ausdruck auf der linken Seite desselben Substitutionsoperators. Wenn Sie zum Beispiel einfangen,
/(foo)(bar)(baz)/
dannfoo
wird\1
,bar
wird\2
undbaz
wird es sein\3
. Dies ist nicht möglichs/(foo)/\1/; s/(bar)/\2/
, da beim zweitens///
Aufruf nur eine erfasste Gruppe vorhanden ist und daher\2
nicht definiert wird.Um also Ihre drei Zifferngruppen zu erfassen, müssten Sie Folgendes tun:
Oder je besser lesbar:
quelle
/(foo)/
sed einem wörtlichen(
Zeichen, gefolgt vonfoo
einem wörtlichen)
. Wenn Sie eine Gruppe erfassen möchten, müssen Sie entweder die Klammern schließen oder die-E
Option verwenden.-r
Flagge, daher gehe ich davon aus, dass ich noch nicht darauf gestoßen bin.-r
Flagge macht das auch, ist aber nicht portabel. GNU sed unterstützt es, aber viele andere nicht. Das-E
ist universeller.Beispiel:
Oder alles zusammen:
quelle
Verwenden Sie Sed mit -r, --regexp-extended, um alle ausgeblendeten Klammern zu vermeiden.
quelle