替换XML文件的最后一行

时间:2012-08-07 16:02:43

标签: bash shell

寻找有关创建脚本的帮助,该脚本将使用标记替换XML文件的最后一行。我有几百个文件,所以我正在寻找能够循环处理它们的东西。我设法按顺序重命名文件:

posts1.xml
posts2.xml
posts3.xml

等...

让循环更容易。但我不知道如何编写脚本来执行此操作。我愿意使用Linux或Windows(但我猜想Linux更适合这种任务)。

4 个答案:

答案 0 :(得分:3)

XMLStarlet是一个用于执行XML解析和操作的命令行工具包。请注意,作为支持XML的工具包,它将尊重XML结构,字符编码和实体替换。

查看ed命令以了解如何修改文档。您可以将其包装在标准的bash循环中。

e.g。在由<elem>链组成的文档中,您可以添加以下<added>5</added>

mkdir new
for x in *.xml; do
    xmlstarlet ed -a "//elem[count(//elem)]" -t elem -n added -v 5 $x > new/$x
done

答案 1 :(得分:3)

因此,如果您想在每个文件中添加一行:

sed -i '$a<YOUR_SHINY_NEW_TAG>' *xml

替换最后一行:

sed -i '$s/.*/<YOUR_SHINY_NEW_TAG>/' *xml

但请注意 sed不是修改xml的理想工具。

答案 2 :(得分:2)

使用sed的Linux方式:

要编辑文件的最后一行,您可以使用sed

sed -i '$s_pattern_replacement_' filename

要将整行更改为“替换”,请使用$s_.*_replacement_。请务必使用_转义replacement中的\个{。}}。

要循环文件,只需使用for

for f in /path/posts*.xml; do sed -i '$s_.*_replacement_' $f; done

然而,这是一种肮脏的方式,因为它不了解XML结构,而XML结构不受新行的影响。您必须确保文件的最后一行包含您期望的内容。

答案 3 :(得分:0)

无论您使用的是Linux,Windows还是MacOS,都没有什么区别

问题是你想用什么语言?

以下是c#中的示例(未优化,但将其读作speudocode):

string rootDirectory = @"c:\myfiles";
var files = Directory.GetFiles(rootDirectory, "*.xml");

foreach (var file in files)
{
  var lines = File.ReadAllLines(file);
  lines[lines.Length - 1] = "whatever you want here";
  File.WriteAllLines(file, lines);
}

您可以编译它并在Windows,Linux等上运行它。

或者你也可以在Python中做同样的事情。

当然这个方法实际上并不解析XML, 但你只想更换最后一行吗?