2016-12-14 4 views
1

Beispiel aus der Datei, wo ich den Benutzernamen ändern wollen:Ersetzen Zeichenfolge zwischen zwei Mustern mit sed - kein Fehler, kein Ergebnis

<host><![CDATA[localhost]]></host> 
<username><![CDATA[root]]></username> 

Here is my regex test, um sicherzustellen, es passt.

Und schließlich die sed-Befehl, der ohne Fehler beendet wird und alles ändert sich nicht:

<host><![CDATA[localhost]]></host> 
TEST 

Außerdem ist es überhaupt nicht zu ersetzen, I:

sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/TEST/g' path/to/file.xml 

Dies sollte das Ergebnis sein muss es so funktionieren, um die einfangenden Gruppen vorher und nachher zu behalten, effektiv nur den Benutzernamen zu ersetzen:

sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/\1TEST\2/g' path/to/file.xml 

Aber das gibt diesen Fehler zurück:

sed: -e expression #1, char 57: invalid reference \2 on `s' command's RHS 

Also ich denke, die diese Gruppen zu losen irgendwie abgestimmt sind, da sie nicht wirklich sie nicht erfassen, die von dem in erster Linie ersetzen replace nichts macht?

Das Endergebnis Ich möchte dies:

<host><![CDATA[localhost]]></host> 
<username><![CDATA[TEST]]></username> 
+2

Warum verwenden Sie eine Regexp, um XML zu analysieren? Wie auch immer, Sie haben keine Capture-Gruppen - Sie müssen '\ (.. \)' verwenden oder (in GNU sed) fügen Sie die Option '-r' hinzu, um die Extended Regular Expression-Syntax zu verwenden. –

+0

Nicht unbedingt XML analysieren, nur Text zwischen zwei Mustern ersetzen. Der Ratschlag in Ihrem Kommentar ist die Art, wie ich es zur Arbeit gebracht habe, also danke. Es wusste ich einfach nicht über die erweiterte Regexp. So sieht mein SED nun in meiner Schleife aus: 'sed -i -r -e 's/(<'"$key"'><\/'"$key"'>)/\ 1'" $ {db_local [$ key]} "'\ 2/g' $ {path_local [site]}/pfad/zu/file.xml' –

Antwort

0

Eine mögliche awk-Lösung, die viel feiner sein könnte:

awk '{if ($0 ~ /username/) gsub(/CDATA\[.+\]/, "CDATA[TEST]"); print $0 }' file.txt 

In Worten:

Wenn die Zeile Benutzernamen enthält, Dann alle Instanzen von CDATA [] mit CDATA [TEST] abschalten. Dies wird die Linie ändern. Dann drucke jede Zeile. Die Regex könnte bei Bedarf weiter verfeinert werden.

0
awk '{sub(/root/,"TEST")}1' file 

<host><![CDATA[localhost]]></host> 
<username><![CDATA[TEST]]></username> 
+2

Es ist eine gute Idee, auch eine Erklärung Ihrer Antwort zu geben – Mikkel

Verwandte Themen