
XMLファイルには次の文字列があります。
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></p></short-description>
交換する必要があります /p>
部分的に/h3>
。
私は以下の助けを借りてそれを試していますsed
:
sed -i -e 's/<h3>Styled here with\:.*\/p>/<h3>Styled here with\:.*\/h3>/g' new_exp_dev02.xml
しかし、これはまったく機能せず、結果は倍増します。
/p>
たぶん部品を正しく交換するために、より多くの記号をエスケープするのを忘れましたか/h3>
?
答え1
sed
式ではほとんどすべての文字を区切り文字として使用できますが、エスケープエラーを制限するために置き換える文字列に区切り文字を使用しないことをお勧めします。
sed -e 's!/p>!/h3\>!g' new_exp_dev02.xml
/p>
に置き換えてください/h3>
。代替のアンパサンド()は代替式で特別な意味を持つ&
ため、エスケープする必要があります。sed
載せてくれた表現sed
は読書も難しく、それで何を成し遂げたいかはよく分からないが「/p>
部品を交換する/h3>
」とは違う目的を持っているようです。
編集:この長い形式で式を作成する必要がある場合は、次のように動作します。
sed -e 's!\(<h3>Styled here with:.*\)/p>!\1/h3\>!g' new_exp_dev02.xml
これにより、一致する部品全体が逆参照に設定され、/p>
交換部品として使用できます\1
。sed
正規表現は一致にのみ使用されるため、交換側では正規表現を使用できません。
この答えの最初の式はのすべての項目を置き換え/p>
、/h3>
2番目の式は/p>
正規表現と一致した直後に発生した場合にのみ置き換えられます。"<h3>Styled here with:.*"
答え2
次のperlコマンドを試すことができます
perl -pne "s/p>/h3>/g" filename
出力
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></h3></short-description>