1

我正在尝试替换文件 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 语句除了逐字打印到命令行之外什么都不做,根本不修改我的文件,即使在打印到命令行的内容中也是如此

4

2 回答 2

3

我认为 sed 是一个错误的工具,因为它不理解 XML 文件的结构,因此,即使你可以让它工作,你的脚本最终也会变得相当脆弱。正如Brian Agnew在他的回答中所建议的那样,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>
于 2012-09-18T13:40:52.490 回答
2

我知道它不会直接回答您的问题,但我会使用一些支持 XML 的东西来修改 XML 文件。这样你就可以避免实体和字符编码的问题,并保持良好的格式。

值得一试的是XMLStarlet作为命令行 XML 工具包。

于 2012-09-18T13:26:59.823 回答