使用sed在多行中找到模式时替换

时间:2013-12-04 03:38:51

标签: regex bash shell sed

我必须在shell脚本中使用sed来纠正与此类似的文本:

>ABC    25  15
>
>FILE   def.exe 3
>INDEX
>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX
>
>ABC    20  18
>
>FILE   def.exe 5
>INDEX
>
>

每次后续行显示“FILE def.exe”时,我需要更改“DEF”的“ABC”模式。请注意,在“ABC”行和“FILE”行之间有一个必须保留的空白行。在该过程结束时,该文件必须如下所示:

>DEF    25  15
>
>FILE   def.exe 3
>INDEX
>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX
>
>DEF    20  18
>
>FILE   def.exe 5
>INDEX
>
>

我尝试使用带有c选项的sed替换一段文本,但没有成功。如果有人有任何建议,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

sed  '/^>ABC/{N;N;/FILE[ ]*def.exe/s/>ABC/>DEF/}' input

如果要修改输入文件,请将-i选项添加到sed。

产地:

>DEF    25  15
>
>FILE   def.exe 3
>INDEX
>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX
>
>DEF    20  18
>
>FILE   def.exe 5
>INDEX
>
>

答案 1 :(得分:0)

使用gnu awk(由于记录选择器)

awk '/def.exe/ {sub(/>ABC/,">DEF")} {print $0 RS}' RS="INDEX" file
>DEF    25  15
>
>FILE   def.exe 3
>INDEX

>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX

>
>DEF    20  18
>
>FILE   def.exe 5
>INDEX

>
>
INDEX