特殊文字を使った sed の使用

特殊文字を使った sed の使用

次のようなXMLファイルでいっぱいのディレクトリがあり、その「オフセット」要素番号の値を1から他の番号に変更したいと考えています。

$ cat my.xml
      <offset xmlns="">1</offset>

この sed コマンドのさまざまな組み合わせを記述しましたが、試したものはどれもエラーなしで実行されませんでした。一部の文字をエスケープする必要があることは確かですが、試したものは常にエラー (「予期しないトークン」、「不明なオプション」など) で終わります。また、実際には式ではないため、-e フラグなしでも試しました。

sed -i -e s/<offset xmlns="">1</offset>/<offset xmlns="">99</offset>/ *.xml

ご協力いただければ幸いです。

答え1

sed ではを使用する必要はなく/、たとえばカンマを使用できます。

sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE

答え2

これを試して、

$ sed 's~<offset xmlns="">1~<offset xmlns="">99~g' file
          <offset xmlns="">99</offset>

入力にスラッシュが含まれている場合は、別の sed 区切り文字を使用します。

答え3

通常、関数自体にこれらすべてが必要なわけではなくs/earch/replace/、代わりに first /address/then conditionallyを使用/s///できます。これにより、読みやすさが向上し、言及した問題のいくつかを回避できるだけでなく、パフォーマンスも向上します。

sed '/offset xmlns=/s/>1</>99</'

答え4

次の値を含む行の 17 番目の文字を置き換えます。

sed -i 's/^\(.\{17\}\)./\1VALUE/' file.xml

VALUE を の新しい値に置き換えます<offset>。例:

sed -i 's/^\(.\{17\}\)./\18/' file.xml

8に変更します。

関連情報