具有多条线的Sed不会替换模式

时间:2011-03-11 19:33:49

标签: sed

我一直在用sed进行按摩(在这里找到教程:Grymoire)我们从硬件供应商处获得的ASCII文件。文件有这样的结构

Model-Manufacturer:D12-500
Test_Version:2.6.3

但是我们收到的一些文件是随机“破损”而错过了“Model-Manufacturer:”

的条目
Model-Manufacturer:D12-500
Test_Version:2.6.3
Model-Manufacturer:H24-700
Test_Version:2.6.3
Test_Version:2.6.3
Model-Manufacturer:R15-300
Test_Version:2.6.3

我想用Sed解决这个问题,并在第二次出现“Test_Version:2.6.3”之前将缺少的条目放在“Model-Manufacturer:N / A”中;这是我的代码

sed -n '
/Test_Version/ {
# found "Test_Version" - read in next line
        N
# look for "Test_Version" on the second line
# and print if there.
        /\n.*Test_Version/ {
# found it - now edit making one line
                s/Test_Version/Model-Manufacturer:N/A/
        }
}' infile > outfile

它不起作用。我相信在更换之前我需要记住每个“Test_Version”和“Model_Manufacturer”的位置,对吗?我可以用sed吗?

提前感谢您的意见。

2 个答案:

答案 0 :(得分:2)

将您的替换更改为:

s||\nModel-Manufacturer:N/A&|

使用备用分隔符意味着您不必在“N / A”中转义斜杠。使用空的左侧重用最近的匹配。 &符将比赛复制到右侧。

此外,您需要删除-n

答案 1 :(得分:1)

如果我理解你想要实现的目标,那么你就非常接近了。我认为将替换命令更改为以下内容使其起作用:

s/\nTest_Version/\nMode-Manufacturer:N\/A\nTest_Version/