2017-10-12 38 views
2

我想提取所有行之前和之後我發現「ACCCC」,直到空行前獲取所有的線路和模式匹配之後,直到有空白行

下面是一個簡單的數據

ABCDEFG 

ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 

ASDASDAA 

我嘗試使用的sed

sed -n '/ACCC/,/^$/p' test 
#ACCCC 
#ASDASDAS 
#ASDASDAS 

但是使用這個我不明白上面的行。

我知道我可以使用grep的-A -B但在此之前和模式之後的行數可能會在我的原始數據改變

我需要提取

ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 

回答

2

使用awk的段落模式(一個或多個空行作爲記錄分隔符)

$ awk -v RS= '/ACCCC/' ip.txt 
ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 
  • -v命令行選項有助於值設置爲變量
  • RS是輸入記錄分隔符,其默認值爲換行符

awk manual

通過一個特殊的分配,一個空字符串作爲RS 的值指示記錄由一個或多個空行分隔。當 RS設置爲空字符串時,每條記錄總是以遇到的第一條空行 結束。下一條記錄不會開始,直到下面的第一條非空白行 。無論在行中出現多少空白行,它們都充當一個記錄分隔符。 (空行,必須是 完全是空的;只包含空格不計行。)

+1

謝謝!有用。你能簡單地解釋一下-v和RS代表 – HeMan

0

這可能爲你工作(GNU SED):

sed '/\S/H;//d;x;/^\n.*ACCC/s/.//p;x;h;d' file 

如果當前行包含非空格字符,將其附加到保存空間(HS),然後將其刪除。否則,交換到HS並檢查其內容是否包含以空行開始的所需字符串,如果是,則刪除空行並打印剩餘內容。在所有情況下,用當前行替換HS,然後刪除它。

+0

謝謝你一個很好的答案!雖然我沒有足夠的RP。起來。 – HeMan