寻找有关创建脚本的帮助,该脚本将使用标记替换XML文件的最后一行。我有几百个文件,所以我正在寻找能够循环处理它们的东西。我设法按顺序重命名文件:
posts1.xml
posts2.xml
posts3.xml
等...
让循环更容易。但我不知道如何编写脚本来执行此操作。我愿意使用Linux或Windows(但我猜想Linux更适合这种任务)。
答案 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, 但你只想更换最后一行吗?