sed を使用して特定のタグ間の部分文字列を置き換える

sed を使用して特定のタグ間の部分文字列を置き換える

2つのsedコマンドを1つにまとめたいのですが、どうすればいいかわかりません。いくつかの方法を試しましたが、成功しませんでした。

その結果、特定のトークン間のすべてのスラッシュをバックスラッシュに置き換えようとします。その結果は次のとおりです。

源泉:

<FilePath>a/b/c/d</FilePath> 
<OtherTags>Bob</OtherTags>
<FilePath>1/2/3/4</FilePath>

結果:

<FilePath>a\b\c\d</FilePath>
<OtherTags>Bob</OtherTags>
<FilePath>1\2\3\4</FilePath>

ラベル間のテキストを変更する次のコマンドが見つかりました。

sed -i -e 's/\(<FilePath>\).*\(<\/FilePath>\)/<FilePath>TEXT_TO_REPLACE_BY<\/FilePath>/g' test.txt

しかし、このコマンドはすべてのテキストを置き換えます...だから私が望むのはテキストを保持し、次のコマンドを使用してスラッシュをバックスラッシュに置き換えることです。

sed -e 's/\\/\//g' test.txt

しかし、これら2つを組み合わせるのは難しいです。

ご協力ありがとうございます。

ベストアンサー1

match()の3番目の引数を一致させるには、GNU awkを使用します。

awk 'match($0,/(.*<FilePath>)(.*)(<\/FilePath>.*)/,a){ gsub("/","\\",a[2]); $0=a[1] a[2] a[3] } 1' file
<FilePath>a\b\c\d</FilePath>
<OtherTags>Bob/Smith</OtherTags>
<FilePath>1\2\3\4</FilePath>

上記は次の入力で実行されました。

$ cat file
<FilePath>a/b/c/d</FilePath>
<OtherTags>Bob/Smith</OtherTags>
<FilePath>1/2/3/4</FilePath>

おすすめ記事