Ersetzen Sie Text durch sed und behalten Sie einen Teil des Originaltexts bei

20

Ich versuche zu konvertieren

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

zu:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

Ich gehe davon aus, dass das beste Werkzeug für den Job wäre sed, kann jedoch nicht herausfinden, wie Teile des Originaltexts im Ersetzungsteil verbleiben.

Wenn ich mache:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

Die Ausgabe ist:

<column name="\1">\2</column>
<column name="\1">\2</column>

Oder wenn Sie es von innen ähnlich machen vi, gibt es Folgendes aus:

<column name=""></column>
<column name=""></column>

Wie kann ich das machen \1und \2wieder auf ihre ursprünglichen Werte zurücksetzen?

Mike
quelle

Antworten:

21

Sie können Gruppen verwenden, zB:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

Der wahrscheinlich verwirrendste Teil bei REs ist, dass es verschiedene syntaktische Varianten gibt.

Sed und vim verwenden beispielsweise reguläre Grundausdrücke, bei denen Sie Anführungszeichen setzen müssen (), um ihre Meta-Bedeutung zu erhalten.

Mit erweiterten regulären Ausdrücken (z. B. awk, egrep und weniger) müssen Sie Anführungszeichen setzen (), um die wörtliche Bedeutung zu erhalten. Es gibt ähnliche Unterschiede für andere Metazeichen.

Das Grundprinzip der BRE- ()Semantik ist, dass es praktischer ist, Klammern für die Meta-Verwendung anzugeben , wenn der größte Teil Ihrer Eingabe C-Code ist.

maxschlepzig
quelle
Dies war eigentlich das erste, was ich versuchte, aber ich bin den Charakteren (und nicht entkommen ). Dumme Frage, aber warum ist das nötig?
Mike
1
@ Mike, gute Frage - hat die Antwort aktualisiert.
maxschlepzig