web-dev-qa-db-ja.com

Sedを使用して、XMLファイル内のテキストを検索および置換します

File.XMLに次のテキストがあります:

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

それを置き換えたい

<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>

私は試した:

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

しかし、このエラーが発生します:

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

問題は、置換区切り文字として使用している/が検索パターンに含まれていることです。そのために別の文字を使用するか、/をエスケープする必要があります。

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

または

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

[X] HTMLの解析に正規表現を使用しないでください である必要があることに注意してください。

最後に、一般的なルールとして、正規表現を使用するときは、少ないほど重要です。すべてのテキストを繰り返すのではなく、できるだけ単純な排他パターンを指定するようにしてください。これにより、コードが読みやすくなるだけでなく、直面しているような問題も回避できます。例えば:

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

ここでは、-rにより拡張正規表現構文が有効になるため、()を使用してグループをキャプチャし(括弧をエスケープする必要はありません)、キャプチャしたテキストを\1として参照できます。したがって、上記のコマンドは、UpdateAccountGUIDsに隣接するコメントを探し、コメントステートメントの最初の終わりまで拡張してから、置換を行います。

11
terdon