我有一个大型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
仅发生在您的工作中是没有必要的在示例中显示的上下文中。
当处理文本的最好的建议是不是“不使用的循环”,它的“不使用外壳循环”,因此使用在这种情况下while循环也是一个不错的办法。请参阅为什么使用shell循环处理文本被认为是不好的做法。
除了处理文本(例如,从文件中读取URL列表以运行curl
)以外,还可以执行Shell循环,在这种情况下(也可以考虑xargs
),然后应该避免for
,请参见https:/ /mywiki.wooledge.org/DontReadLinesWithFor。
由于sed脚本位于单引号内,因此sed '0,/REPLACEME/s//$line/'
不允许$line
扩展。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句