使用awk或sed删除两个模式(包括模式)之间的线

时间:2015-06-13 20:19:25

标签: awk sed

我的输出文件如下:

for i=1:26
    for j=1:3
        coflux_SAm(i,j,:)=0;
    end
end

for i=35:36
    for j=11:18
        coflux_SAm(i,j,:)=0;
    end
end

我需要删除模式judi#cat file ---ABC--- word1 word2 word3 word4 word5 word6 ---end_ABC--- ---DEF--- line1 line2 line3 line4 ---end_DEF--- judi# ABC之间的行(包括模式,然后替换为新内容;新内容位于文件中)。

文件内容各不相同,所以我只需要使用模式。

end_ABC

期望的结果必须是

judi#file1
---ABC---
wordA1
wordA2
wordA3
---end_ABC---
judi#

我试过这个命令:

judi#
---ABC---
wordA1
wordA2
wordA3
---end_ABC---

---DEF---
line1
line2
line3
line4
---end_DEF---
judi#

但是我收到了这个错误:

sed '/ABC/,/end_ABC/{/ABC/!{/end_ABC/!d}}' file > file 2

2 个答案:

答案 0 :(得分:1)

sed '/end_ABC/a ##here' file | sed '/ABC/,/end_ABC/d' | sed '/##here/r file1' | sed '/##here/d' >file2  

输出

judi#cat file
judi#file1
---ABC---
wordA1
wordA2
wordA3
---end_ABC---
judi#

---DEF---
line1
line2
line3
line4
---end_DEF---
judi#
匹配a ##here后,

##here会追加end_ABC

r file1在找到模式##here后从file1插入文本。

答案 1 :(得分:0)

永远不要使用范围表达式,因为它们使得琐碎的任务变得非常简单,但即使是稍微复杂的任务也需要完全重写或复制条件。只需使用标志:

awk '
NR==FNR { rep = rep $0 OFS; next }
/---ABC---/ { printf "%s", rep; inBlock=1 }
!inBlock
/---end_ABC---/ { inBlock=0 }
' file1 file