使用脚本在文件中查找和替换

时间:2014-07-02 12:55:22

标签: bash

我想找到并将VALUE替换为xml文件:

<test name="NAME" value="VALUE"/>

我必须按名称过滤(因为有很多这样的行)。

有可能吗?

谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

由于您标记了问题&#34; bash&#34;,我认为您并未尝试使用XML库(尽管我认为XML专家可能会为您提供类似XSLT处理器的功能这个问题很有力地解决了这个问题),但你只是对搜索和搜索感兴趣。从命令行替换。

我正在使用perl:

perl -pi -e 's#VALUE#replacement#g' *.xml

请参阅perlrun手册页:很快就将-p切换到文本处理模式,-i代表&#34;就地&#34;和{{ 1}}让你指定一个表达式来应用于所有输入行。

另请注意(如果您对此已不太熟悉),您可以使用除-e之外的其他字符(常见字符为#,逗号等)与您的搜索冲突&amp;替换字符串。

有一个小警告:perl会读取&amp;编写命令行上给出的所有文件,即使是那些没有改变的文件。因此,文件&#39; 修改时间即使没有更改也会更新。 (我通常使用更多的shell魔法解决这个问题,例如使用%grep -l来选择要处理的perl文件。)

编辑:如果我正确理解您的评论,您还需要有关正则表达式的帮助才能应用。让我简单地建议一下这样的事情:

grin -l

答案 1 :(得分:1)

相关:bash XHTML parsing using xpath

您可以使用SED

SED 's/\(<test name=\"NAME\"\) value=\"VALUE\"/\1 value=\"YourValue\"/' test.xml

其中test.xml是包含给定节点的xml文档。这非常脆弱,如果您需要多次进行此替换,您可以努力使其更加灵活。例如,当前语句区分大小写,因此它不会替换名称为“name”的节点上的值,但您可以在语句末尾添加不区分大小写的标志,如下所示:

('s/\(<test name=\"NAME\"\) value=\"VALUE\"/\1 value=\"YourValue\"/I')

另一种选择是使用XSLT,但需要您下载外部库。它非常通用,可以成为对XML文档进行更复杂修改的可行选择。