it-swarm.com.de

Verwenden von Sed zum Suchen und Ersetzen von Text in einer XML-Datei

Ich habe den folgenden Text in File.XML:

<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->

Ich würde das gerne ersetzen durch

<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>

Ich habe es versucht:

$ sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>/' File.XML

Aber erhalten Sie diesen Fehler:

sed: -e expression #1, char 63: unknown option to `s'
6
Shanker

Das Problem ist, dass Ihr Suchmuster / enthält, das Sie als Ersatzbegrenzer verwenden. Sie müssen dafür ein anderes Zeichen verwenden oder das / verlassen:

sed -i 's#<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->#<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>#' File.XML

oder

sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs>/' File.XML

Beachten Sie, dass Sie verwenden Sie niemals reguläre Ausdrücke, um [X] HTML zu analysieren .

Schließlich ist weniger in der Regel mehr, wenn Sie mit regulären Ausdrücken arbeiten. Sie sollten versuchen, das einfachste exklusive Muster anzugeben, anstatt den gesamten Text zu wiederholen. Dies erleichtert nicht nur das Lesen Ihres Codes, sondern vermeidet auch Probleme wie die, mit denen Sie konfrontiert waren. Zum Beispiel:

sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<\1>/' File.XML

Hier aktiviert der -r die Syntax für erweiterte reguläre Ausdrücke, sodass wir () verwenden können, um eine Gruppe zu erfassen (ohne die Klammern zu umgehen) und dann den erfassten Text als \1 zu bezeichnen. Der obige Befehl sucht also einfach nach einem Kommentar, der an UpdateAccountGUIDs angrenzt, sich bis zum ersten Ende der Kommentaranweisung erstreckt und dann die Ersetzung vornimmt.

11
terdon