2

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

posts1.xml
posts2.xml
posts3.xml

ETC...

使其更容易循环通过。但我不知道如何编写脚本来做到这一点。我愿意使用 Linux 或 Windows(但我猜 Linux 更适合这种任务)。

4

4 回答 4

3

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
于 2012-08-07T16:07:13.307 回答
3

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

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

要替换最后一行:

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

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

于 2012-08-07T16:17:37.653 回答
2

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 结构不受换行符的影响。您必须确保文件的最后一行包含您所期望的内容。

于 2012-08-07T16:11:41.667 回答
0

无论您是在 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,但你只是想替换最后一行,对吧?

于 2012-08-07T16:10:43.713 回答