我坚持让我的sed脚本工作。 我想要做的是找出匹配的单词和替换。 但是,在替换时,请参考intf.txt并按行顺序替换每个找到的项目。
例如,我想替换" 5/0/0"和" 5/1/0"用" 6/3/0"和" 7/1/3"。
这是原始输入。 $ more test.xml | grep --line-number physical_interface
199: <physical_interface>5/0/0</physical_interface>
256: <physical_interface>5/1/0</physical_interface>
这是我写的shell。 $ more replace-intf.sh
#!/bin/bash
while read line;
do
sed -e "s|[0-9]\/[0-9]\/[0-9]|$line|" ~/test.xml
done <intf.txt`
需要&#34; intf.txt&#34;作为输入变量。
$ more intf.txt
6/3/0
7/1/3
我将sed结合到while循环中。 所以,我希望它将逐行替换为intf.txt中的内容。
这是执行和输出脚本。 $ more exec.sh
#!/bin/bash
./replace-intf.sh | sed -e '414,$d' > test1.xml
more test1.xml | grep --line-number physical_interface
结果如下。
$ ./exec.sh
199: <physical_interface>6/3/0</physical_interface>
256: <physical_interface>6/3/0</physical_interface>
现在,我的脚本只占用intf.txt的第一行。它永远不会引用第二行,即7/1/3并且不会取代5/1/0。
任何人都知道我的剧本会出现什么问题?
任何评论都非常感谢。
答案 0 :(得分:1)
sed
在给定文件中的所有行上运行替换,而不仅仅是第一行。因此,在循环的第一次迭代中,它用6/3/0替换两个物理接口,在第二次迭代中,它用7/1/3替换它们。
您的下一个sed
命令会从第414行开始删除所有内容。因此,第二次替换显然会被删除。
但是,您可以使用sed
生成仅更改正确行的sed
脚本:
grep -n '[0-9]/[0-9]/[0-9]' test.xml \
| cut -f1 -d: \
| paste - intf.txt \
| sed 's%\t%s=\[0-9\]/\[0-9\]/\[0-9\]=%;s/$/=/' \
| sed -f- test.xml
第一个sed
生成的代码将是
199s=[0-9]/[0-9]/[0-9]=6/3/0=
256s=[0-9]/[0-9]/[0-9]=7/1/3=