Sed命令不替换

时间:2015-11-19 16:59:24

标签: regex bash shell sed

我坚持让我的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。

任何人都知道我的剧本会出现什么问题?

任何评论都非常感谢。

1 个答案:

答案 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=