bash字符串替换文件

时间:2012-09-18 13:21:08

标签: regex bash sed wildcard

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

2 个答案:

答案 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工具包。