2015-06-13 52 views
0

我的输出文件是如下删除线(包括该图案的),使用AWK或sed的

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 

但要下面提到的错误

sed: command garbled: /ABC/,/end_ABC/{/ABC/!{/end_ABC/!d}} 
+1

您的命令在GNU sed下适用于我。如果你使用的是BSD(OSX)sed,可以考虑在大括号之前加上一些分号:'''''>';}'。 – John1024

+0

是的命令看起来不错(GNU sed),只有文件+2,该命令将删除范围内的所有行,除了第一个和最后一个 – josifoski

+0

在未来,请学会搜索S.O.发布之前。您的标题'删除两个图案之间的线条'(图案上有's')会返回76个项目。祝你好运。 – shellter

回答

0
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# 

这里##是追加“##在这里'匹配后/ end_ABC/
r file1在找到模式'## here'后从file1中插入文本。

+0

我想我正在使用一些其他的硒不GUN sed,因为你提到..得到下面的错误“sed:命令乱码:/ end_ABC/a ##这里”我该如何检查哪个硒正在使用? – judi

+0

sed --version + [link](https://www.topbug.ne​​t/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/ ) – josifoski

+0

+ [link](http://sourceforge.net/projects/gnuwin32/files/?source=navbar) – josifoski

0

不要使用范围表达式,因为它们使得简单的任务变得非常简短,但即使稍微复杂的任务也需要完整的重写或重复条件。只需使用一个标志:

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