gpt4 book ai didi

xml - 从列表或文件中查找单个字符串的每个实例并将其替换为另一个字符串

转载 作者:行者123 更新时间:2023-12-03 09:55:21 25 4
gpt4 key购买 nike

我有一个大型XML文件,其中包含字符串REPLACEME的多个实例。在第二个文件中,我有一个字符串列表(包含逗号),例如:

58,-21,0
234,-38,0

我想用第二个文件中的一个值替换第一个文件中的 REPLACEME的每个实例,然后继续进行下一个实例。

我看过bash(sed,awk,perl)和Powershell。有人告诉我,我不应该使用循环,而是使用文件循环并解析回文件。因此,我尝试了以下方法:
file2=/file2.txt
while IFS= read -r line; do
printf '%s\n' "$line"
sed '0,/REPLACEME/s//$line/' /file1.xml
done < "$file2"

但是它什么也没做。可能是因为XML文件包含符号吗?它没有错误,它什么也没做。

如果我可以找到可以实现替换结果的东西,是否愿意完全放弃我的代码或切换解析器?

编辑:
要求提供XML的示例。 XML标记是KML文件的一部分,字符串是坐标点。下面的例子:
<Placemark>
<name>5005</name>
<MultiGeometry>
<Polygon>
-snip-
</Polygon>
<Point>
<gx:drawOrder>1</gx:drawOrder>
<coordinates>REPLACEME</coordinates>
</Point>
</MultiGeometry>
</Placemark>

此文件中有数百个此类条目,需要使用file2中列表中的相应坐标来填充。

最佳答案

听起来您需要的是:

awk 'NR==FNR{a[NR]=$0; next} /REPLACEME/{sub(/REPLACEME/,a[++c])} 1' file2.txt file1.xml

通常的建议是在处理xml文件时使用诸如xmlstarlet或xmllint之类的可识别XML的工具,但是我个人并不十分了解使用它们来解决此问题,恕我直言,假设您使用的是 REPLACEME,则对于您正在做的事情没有必要发生在示例中显示的上下文中。

处理文本时,最好的建议不是“不要对循环使用 ”,而是“不要对 shell 使用循环”,因此在这种情况下使用while循环也是一种不好的方法。参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice

当除了操作文本(例如,从文件中读取URL列表以在其上运行curl)以外执行其他操作时,可以使用shell循环,在这种情况下(但也可以考虑使用xargs),然后是的,您应该避免for,请参见https://mywiki.wooledge.org/DontReadLinesWithFor

您的sed脚本sed '0,/REPLACEME/s//$line/'将不会扩展$line,因为它位于单引号内。

关于xml - 从列表或文件中查找单个字符串的每个实例并将其替换为另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61023717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com