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'
問題は、置換区切り文字として使用している/
が検索パターンに含まれていることです。そのために別の文字を使用するか、/
をエスケープする必要があります。
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
に隣接するコメントを探し、コメントステートメントの最初の終わりまで拡張してから、置換を行います。