Bash 替换XML文件的最后一行

Bash 替换XML文件的最后一行,bash,shell,Bash,Shell,正在寻找有关创建脚本的帮助,该脚本将用标记替换XML文件的最后一行。我有几百个文件,所以我正在寻找一些可以循环处理它们的东西。我已成功按如下顺序重命名文件: posts1.xml posts2.xml posts3.xml 等等 使循环更容易。但我不知道如何写一个脚本来实现这一点。我愿意使用Linux或Windows(但我想Linux更适合这类任务)。是一个用于执行XML解析和操作的命令行工具包。注意,作为一个支持XML的工具包,它将考虑XML结构、字符编码和实体替换 查看该命令以了解如何修改

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

posts1.xml
posts2.xml
posts3.xml
等等

使循环更容易。但我不知道如何写一个脚本来实现这一点。我愿意使用Linux或Windows(但我想Linux更适合这类任务)。

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

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

e、 g.在由
s链组成的文档中,您可以添加以下
5


无论您是在Linux、Windows还是MacOS上,这几乎没有什么区别

问题是你想用什么语言

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

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

也可以在Python中执行同样的操作

当然,这个方法实际上并没有解析XML,
但是您只是想替换最后一行,对吗?

使用
sed的Linux方式:

sed -i '$s_pattern_replacement_' filename
要在位编辑文件的最后一行,可以使用
sed

sed -i '$s_pattern_replacement_' filename
要将整行更改为“替换”,请使用
$s.*.\u replacement\u
。确保用
\
替换
中的
\
转义任何
\

要循环文件,只需使用
for

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

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

因此,如果要在每个文件中追加一行:

sed -i '$a<YOUR_SHINY_NEW_TAG>' *xml
sed-i'$a'*xml
要替换最后一行,请执行以下操作:

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

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

您可以发布一个输入示例以及您想将其更改为什么吗?他只想替换最后一行,同时可能考虑xml字符编码,实体编码和结构等。我认为您跳过了所需解决方案的一个主要部分。是的,您的解决方案成功了Brian:-)只是发现问题有点模糊,我想指出操作系统在这里不是一个真正的因素:)他应该将您的答案标记为:)或者知道编码或实体。我不会说它不起作用,但它是一个有限的子类,当我使用这个命令时,我遇到了一个错误:
未知选项到's'
我想可能是文件中有一些特殊字符导致了这个问题。
sed-I'$s/*/'*.xml
sed:-e expression#1,char 10:'s'的未知选项
@johnmcp My bad。请参阅,这是因为
/
s
命令的分隔符,但替换中还有一个
/
。我在开始写答案时想到了这一点,所以我使用了另一个分隔符:
\uuu
。但是后来我忘了,又用了
/
。。我会整理答案,你有两个选择:使用
\uuuu
作为分隔符,或者在标记
中转义
。当然,我也应该发现这一点。谢谢你的解释。布莱恩,谢谢你的回答,我不知道这个工具包。实际上,我最终还是采用了sed方法,因为我只想对每个文件使用相同的结束标记进行简单的替换。但是我认为这个工具包在将来会派上用场,因为我在第一次使用
sed-ie'$d'posts*.xml
删除最后一行之后,最后使用了append选项
sed -i '$s/.*/<YOUR_SHINY_NEW_TAG>/' *xml