【问题标题】:bash string replacement in a file文件中的bash字符串替换
【发布时间】:2012-09-18 13:21:07
【问题描述】:

我正在尝试替换文件 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) 在确定变量$SRC 中的内容后,我需要一个通配符来指定我想替换randomtext

2) 我的 sed 语句除了逐字打印到命令行之外什么都不做,根本不修改我的文件,即使在打印到命令行的内容中也是如此

【问题讨论】:

    标签: regex bash sed wildcard


    【解决方案1】:

    我认为 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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我希望你不介意我添加类似的答案,但举个例子 - 当我看到你的答案时,我已经制定了一个适当的 xmlstarlet 调用,并且不愿意放弃它...
      • @MarkLongair - 一点也不。我投了赞成票,因为一个例子是值得的
      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 2019-05-19
      • 2012-04-21
      • 2021-03-19
      • 1970-01-01
      • 2019-03-28
      • 2015-02-05
      • 2015-01-16
      相关资源
      最近更新 更多