寻求帮助创建一个脚本,该脚本将用标记替换 XML 文件的最后一行。我有几百个文件,所以我正在寻找可以循环处理它们的东西。我设法像这样按顺序重命名文件:
posts1.xml
posts2.xml
posts3.xml
ETC...
使其更容易循环通过。但我不知道如何编写脚本来做到这一点。我愿意使用 Linux 或 Windows(但我猜 Linux 更适合这种任务)。
XMLStarlet是一个用于执行 XML 解析和操作的命令行工具包。请注意,作为一个支持 XML 的工具包,它将尊重 XML 结构、字符编码和实体替换。
查看ed命令以了解如何修改文档。您可以将其包装在标准 bash 循环中。
例如,在由 s 链组成的文档中<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
因此,如果您想在每个文件中附加一行:
sed -i '$a<YOUR_SHINY_NEW_TAG>' *xml
要替换最后一行:
sed -i '$s/.*/<YOUR_SHINY_NEW_TAG>/' *xml
但请注意,sed
不是修改 xml 的理想工具。
Linux方式使用sed
:
要编辑文件的最后一行,您可以使用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 结构不受换行符的影响。您必须确保文件的最后一行包含您所期望的内容。
无论您是在 Linux、Windows 还是 MacOS 上,这几乎没有区别
问题是你想使用什么语言?
以下是 c# 中的示例(未优化,但将其视为伪代码):
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,但你只是想替换最后一行,对吧?