尽管我使用grep查找相同的字符串没有问题,但我还是很难解决替换XML文件中的文本字符串的问题。由于要替换的新字符串和旧字符串包含许多特殊字符,因此我认为最好将它们存储在变量中,而不是使用大量的反斜杠:
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'ing确认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
知道我在这里缺少什么吗?
将shell变量放在单引号中会禁用其解释。这就是为什么您的命令无效的原因。
$ 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] 删除。
我来说两句