grepを使用して同じ文字列を見つけるのに問題がないにもかかわらず、XMLファイル内のテキストの文字列をsedで置き換えるのに問題があります。置き換えられる新しい文字列と古い文字列には多くの特殊文字が含まれているため、多数の円記号を使用するのではなく、変数に格納するのが最善だと思いました。
OLD_STRING='<property name="webServiceHost">${jboss.bind.address}</property>'
NEW_STRING='<!--<property name="webServiceHost">${jboss.bind.address}</property>-->'
文字列は期待どおりに保存されているようです。
$ echo $OLD_STRING; echo $NEW_STRING
<property name="webServiceHost">${jboss.bind.address}</property>
<!--<property name="webServiceHost">${jboss.bind.address}</property>-->
Grepを実行すると、古い文字列がXMLファイルに存在することが確認されます。
$ grep "$OLD_STRING" jboss-beans.xml
<property name="webServiceHost">${jboss.bind.address}</property>
ただし、次のsedコマンドは何も出力しません。
sed -i 's/"$OLD_STRING"/"$NEW_STRING"/g' jboss-beans.xml
私がここで何を見逃しているのか分かりますか?
シェル変数を一重引用符で囲むと、その解釈が無効になります。そのため、コマンドは効果がありません。
$ echo 's/"$OLD_STRING"/"$NEW_STRING"/g'
s/"$OLD_STRING"/"$NEW_STRING"/g
次のように書く必要があります。
sed -i "s/'$OLD_STRING'/'$NEW_STRING'/g" jboss-beans.xml
ただし、変数は呼び出す前に解釈sed
され、再び特殊文字が含まれます。
$ echo "s/'$OLD_STRING'/'$NEW_STRING'/g"
s/'<property name="webServiceHost">${jboss.bind.address}</property>'/'<!--<property name="webServiceHost">${jboss.bind.address}</property>-->'/g
そのためsed
、この特別な機能s///
により、コマンド区切り文字を使用するだけで定義できます。例:
sed -i "s#'$OLD_STRING'#'$NEW_STRING'#g" jboss-beans.xml
それでも、検索式には特別な正規表現文字が含まれており、sed
このように使用することはその能力の無駄です。私は次のような式を書きます:
sed -i 's/\(<.*webServiceHost.*jboss.bind.address.*>\)/<!--\1-->/' jboss-beans.xml
もちろん、必要に応じて一致文字列を多かれ少なかれ具体的にすることができます。役立つ他の素晴らしい機能もあります。sed
特定のパターンに一致する行に編集操作を絞り込むことができます。コマンドは次のようになります。
sed -i '/webServiceHost/ s/^\(.*\)$/<!--\1-->/' jboss-beans.xml
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加