我的输出文件如下:
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
答案 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