我有一个XML文件,结构如下:
<root>
<station name = "insert_text"/>
<station name = "insert_text"/>
<station name = "insert_text"/>
</root>
我想替换文字&#34; insert_text&#34;使用文本文件中的值,如下所示:
Station1
Station2
Station3
在阅读上面的输入文件后,生成的XML文件应如下所示:
<root>
<station name = "Station1"/>
<station name = "Station2"/>
<station name = "Station3"/>
</root>
我现在使用的脚本如下,它仅用&#39; Station1&#39;替换所有3行。
while read a
do
sed -i -e "s/insert_text/$a/g" filename.xml
done<inputfile.txt
为了用不同的文本替换XML文件中的每一行,我应该更改什么?
答案 0 :(得分:3)
我认为awk
更适合这项任务:
<强>演示强>
$ cat inputfile.dat
Station1
Station2
Station3
$ cat filename.xml
<root>
<station name = "insert_text"/>
<station name = "insert_text"/>
<station name = "insert_text"/>
</root>
$ awk 'NR==FNR{a[++c]=$1;next}/station name/{sub("insert_text",a[++i])}1' inputfile.dat filename.xml
<root>
<station name = "Station1"/>
<station name = "Station2"/>
<station name = "Station3"/>
</root>
答案 1 :(得分:3)
<强>问题强>
您的代码存在的问题是,一旦替换文件中的insert_text
,就不再有insert_text
替换为Station2
和Station3
。
<强>解决方案强>
解决方案是在替换第一个insert_text
后退出替换,并从文件中读取下一行
您可以通过
执行此操作while read a;
do
sed "1,/insert_text/ s/insert_text/$a/; " input;
done < file
它的作用是什么?
1,/insert_text/
这是一个地址范围,告诉sed从第1行到第一个insert_text
进行替换。没有其他insert_text
被替换或强>
sed "/insert_text/{s/insert_text/$a/;q;}" input;
答案 2 :(得分:1)
另一个awk采取这个... ...而不是将一个文件读入内存中的数组,然后读取第二个文件以替换文本,您可以一次流式传输这两个文件:
NSDate
如果您的电台列表大于您可以舒适地放在内存中,这种方法将是有利的。
为便于阅读而分解,这是脚本的作用:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SirepClient /v DisableProtocol3 /t REG_DWORD /d 1