【问题标题】:Sed command does not replace [duplicate]sed命令不替换[重复]
【发布时间】:2015-11-20 01:53:34
【问题描述】:

我的 sed 脚本无法正常工作。 我想做的是找出匹配的单词并替换。 但是在替换时,请参考 intf.txt 并以每一行依次替换找到的每个项目。

例如,我想将“5/0/0”和“5/1/0”替换为“6/3/0”和“7/1/3”。

这是原始输入。 $ 更多 test.xml | grep --line-number 物理接口

199:                  <physical_interface>5/0/0</physical_interface>
256:                  <physical_interface>5/1/0</physical_interface>

这是我写的shell。 $ 更多 replace-intf.sh

#!/bin/bash
while read line;
do
        sed -e "s|[0-9]\/[0-9]\/[0-9]|$line|" ~/test.xml
done <intf.txt`

它将“intf.txt”作为输入变量。

$ 更多 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。

有人知道我的脚本有什么问题吗?

任何cmets都非常感谢。

【问题讨论】:

  • replace-interface.shreplace-intf.sh是什么关系?
  • 你的代码中有很多奇怪的误解和非常规的结构。如果你能减少它的特殊性,那么需要整理的切线垃圾就会减少。您认为您可以将您的问题简化为您的一个假设,这似乎与您实际看到的相矛盾吗?

标签: regex bash shell sed


【解决方案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=

【讨论】:

  • 感谢您的及时回复!有用!我不明白的是,在第一次“sed”运行之后,附加部分如何在第二次“sed”时被很好地删除?比如第二个'sed'是如何处理"199s=[0-9]/[0-9]/[0-9]="的?它只是被忽略了吗?它在第二个“sed”时被很好地删除。
  • 另一个问题是,我的系统返回以下错误。 ./replace-intf.sh: line 4: paste: command not found 我包含了#!/bin/sh 或#!/bin/bash,但没有帮助。有没有其他方法可以代替粘贴命令?
  • paste 在我的系统上是 /usr/bin/paste,它是 coreutils 的一部分。
  • 谢谢。你能回答我的第一个问题吗? "199s=[0-9]/[0-9]/[0-9]=" 部分与 标签无关。它不匹配。第二个“sed”如何选择 6/3/0 和 7/1/3 并很好地替换?
  • @K.K. 199 是要替换的行号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2021-08-14
  • 2021-07-06
  • 2018-04-23
  • 2020-09-22
  • 2019-05-12
  • 2022-01-10
相关资源
最近更新 更多