我正在尝试替换文件replacetest.xml中的一些文本
这是我要修改的文件的一部分。
<class name="replace_after_this_string">randomtext</class>
我想用文本索引
中的文本更改文本randomtext
orgs=( item1 item2 )
并用这些修改覆盖文件。
我的主要问题是通配符和sed
命令。所以这就是我试过的
orgs=( item1 item2 )
SRC="name="'"replace_after_this_string"'">"
#need some sort of wildcard here
for i in "${orgs[@]}"
do
:
# do whatever on $i
DST=$SRC$i
sed -e 's/$SRC/$DST/g' -i replacetest.xml
done
1)在确定变量randomtext
$SRC
2)我的sed语句除了逐字打印到命令行之外什么都不做,根本不修改我的文件,即使是打印到命令行的内容
答案 0 :(得分:3)
我认为sed是错误的工具,因为它不了解XML文件的结构,因此,即使你可以让它完全工作,你的脚本也会变得相当脆弱。在Brian Agnew suggests的答案中,xmlstarlet是一个用于处理XML文件的有用工具。例如,如果您的文件(12477913.xml
,例如)如下:
<?xml version="1.0"?>
<foo>
<class name="replace_after_this_string">randomtext</class>
<class name="not_for_replacing">some other text</class>
</foo>
...然后这个命令:
xmlstarlet ed -u './/class[@name="replace_after_this_string"]' \
-v 'REPLACED HERE' 12477913.xml
...将产生以下输出:
<?xml version="1.0"?>
<foo>
<class name="replace_after_this_string">REPLACED HERE</class>
<class name="not_for_replacing">some other text</class>
</foo>
答案 1 :(得分:2)
我知道它没有直接回答你的问题,但我会使用XML-aware来修改XML文件。这样你就可以避免实体和字符编码问题,并保持良好的形式。
值得查看XMLStarlet作为命令行XML工具包。