2015-06-13 53 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