使用&sed'替换每行使用不同的文本。 (shell脚本)

时间:2016-01-29 13:37:30

标签: shell unix replace sed

我有一个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文件中的每一行,我应该更改什么?

3 个答案:

答案 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替换为Station2Station3

<强>解决方案

解决方案是在替换第一个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