
サンプルパスタグの現在の要素を次のように置き換えたいと思います。
...
<examples>
<example path='/test/test123/test12345.txt'/>
<examples>
...
到着
...
<examples>
<example path=/test/test123/>
<examples>
...
そして
sed -i 's/<example path=\/test\/test123\/test12345.txt'>/<example path=\/test\/test123\/>' 123.xml
しかしそれは言う:
-bash: example: No such file or directory
答え1
一重引用符が一致しないため、エラーが発生します。
引用符付きの文字列は、2番目の引用符で終わります。シェルは引用解除された内容を表示し、>/<example
それをリダイレクトとして解釈します。
また、sed
コマンドが不完全です。/
末尾の区切り記号がありません。
sed
編集した入力データと一致するようにコマンドも変更しました。
コマンドに一重引用符を使用するには、sed
コマンドの周囲に二重引用符を使用し、二重引用符内の内容がシェルによって拡張されないようにする必要があります。
sed -i "s/<example path='\/test\/test123\/test12345.txt'\/>/<example path=\/test\/test123\/>/" 123.xml
または、次のようにエスケープされた単一引用符を使用します。
sed -i 's/<example path='\''\/test\/test123\/test12345.txt'\''\/>/<example path=\/test\/test123\/>/' 123.xml
注:/
スラッシュ以外の区切り文字を使用している場合は、パターンまたは置換でスラッシュをエスケープする必要はありません。
sed -i "s#<example path='/test/test123/test12345.txt'/>#<example path=/test/test123/>#" 123.xml
sed -i 's#<example path='\''/test/test123/test12345.txt'\''/>#<example path=/test/test123/>#' 123.xml
質問に表示される希望の出力は有効なXMLではありません。属性は引用する必要があります。
答え2
XMLを編集するには、XMLエディタを使用する必要があります。ファイルのXMLスキーマレイアウトの変更、予期しないコメントなどを処理できます。私の最初の選択はxmlstarlet
サンプルファイル、x.xml
<root>
<examples/>
<example path='/test/test123/test12345.txt'/>
<examples/>
</root>
path
すべての要素の属性をexample
値で更新するコマンド/test/test123
xmlstarlet ed --update '//example/@path' --value '/test/test123' x.xml
出力
<?xml version="1.0"?>
<root>
<examples/>
<example path="/test/test123"/>
<examples/>
</root>
答え3
sed -i -e s/test\///g 123.xml
ただ削除して
sed -i -e s/test\//replacement/g 123.xml
別のものに変更してください