2016-06-29 11 views
0

Ich habe eine Datei mit einer langen einzelnen Zeile zwischen XML-Tags, ich möchte den Inhalt zwischen den Tags mit sed ersetzen.Ersetze mehrzeilige Zeichenfolge zwischen zwei Mustern mit sed

1300_character_long_string_here

Die Probleme ich habe, ist, dass trotz nicht sed ersetzt, dass ich meine Regex wissen richtig auswählen. Das heißt, selbst wenn ich in der Lage bin, richtig zu wählen und zu ersetzen, weiß ich nicht, wie man die Ersetzungszeichenfolge (die ungefähr so ​​lang ist) aus einer Datei zieht und sie platziert.

Hier ist einer meiner erfolgreichen aktuellen Versuche der Befehl:

sed 's/\<Tag\>(.*)\<\/Tag\>/REPLACE/g' test.txt> out.txt 

Obwohl dies nicht, dass ich sehen kann, funktioniert das ersetzt wird, wenn ich versuchen, nur den ersten Tag zu ersetzen.

Ich hätte am Anfang erwähnen sollen, dass dies ein AIX-System ist, kein GNU-System.

+1

Haben Sie versucht 's # \ (. *) \ <\/Tag\> # REPLACE # g''? – Beta

+0

Suche nach 'Ersetze mehrzeilige Zeichenfolge [sed]' gibt 14 Q/As zurück. Hast du durch diese Antworten geschaut? Sie werden mit ziemlicher Sicherheit einen guten Rat finden. Viel Glück. – shellter

+0

Reguläre Ausdrücke sind nicht geeignet, XML-Dokumente zu ändern – hek2mgl

Antwort

0

Ich schlage vor, so etwas wie dieses:

File1 enthält den Ersatztext, z.B.

some other string 

File2 enthält die markierte Zeile:

... 
<tag>some string</tag> 
... 

Jetzt können Sie sagen:

sed '1{h;d}; /<tag>/{x;s/^/<tag>/;s/$/<\/tag>/}' File1 File2 

Wie das funktioniert: Zuerst lesen Sie die Ersatzdatei, legen Sie seine einzige Zeile im Haltebereich und lösche es aus dem Ausgabestream. Wenn eine Zeile mit <tag> übereinstimmt, rufen Sie den Ersatztext aus dem Speicherbereich ab und fügen Sie Tags hinzu.

1

Sie können Ihren Ersatztext aus einer Datei mit dem r Befehl ein:

und Flucht nicht die < und > in Ihren Tags, wie es für word boundaries verwendet wird. Es könnte erklären, warum Ihr Muster nicht übereinstimmt.

+0

Rechts. @KeigaTide Sie haben zu verstehen, welche Auswirkungen das Entkommen auf jedes Zeichen hat. Wenn Sie einem Meta-Zeichen entkommen (zB '*'), wird es literal, aber wenn Sie ** einige literale Zeichen in einigen sends entkommen, werden sie Metazeichen (zB '+' oder in diesem Fall '<' and '>' werden Wortgrenzen in GNU sed). Wenn Sie sich nicht sicher sind, verwenden Sie '[]', um ein Zeichen zu kapseln (z. B. '[<]'), um sicherzustellen, dass Sie bei Bedarf ein Metazeichen in ein Literal umwandeln, aber nicht versehentlich ein Literal in ein Metazeichen verwandeln). –

+0

@Kenavoz Wie geschrieben, kann meine Version von sed Ihre Lösung nicht analysieren, ich werde daran stochern. Wortgrenzen sind etwas, von dem ich nichts wusste, danke. Das heißt, das Entfernen der Escape-Zeichen führte dazu, dass die Regex die gesamte Zeichenfolge auswählte. – KeigaTide

+0

@KeigaTide Das '(' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Es wird nicht nur der '' Inhalt, sondern die ganze Zeichenfolge übereinstimmen. – SLePort

Verwandte Themen