2016-09-07 38 views
2

我迷路了,同時找出了在兩個字符串之間打印的方法。這兩個字符串都包含特殊字符,如<,>使用awk打印兩個正則表達式之間的差異

我能夠達到這個使用sed完美無瑕(但不能使用),但我需要awk,因爲我需要對結果進行進一步的文本處理。

下面是示例文件:

$ cat input.txt 
RANDOM CLI> THIS IS BEFORE WINDOW 
RANDOM CLI> 
RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 
RANDOM CLI> 
RANDOM CLI>THIS IS OUT OF WINDOW 

我在之間的文本intrested 「RANDOM CLI>日誌列表中的所有節目...」和明年「RANDOM CLI>」

這可以使用SED被做NE,如下圖所示:

$ sed -n '/CLI>log/,/ CLI>/p' cli 
RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 

但正如我提到,sed不是吹田適合我的要求,並且只需要一個awk解決方案。

一些嘗試逃避特殊字符,但沒有幫助。

awk '/CLI>log/,/ CLI>/' input.txt 
RANDOM CLI>log list all show... 

awk '/CLI\>log/,/CLI\>/' input.txt 

awk '/CLI>log/{f=1;for (i=0;i<=NR;i++){getline}}/CLI>/{f=0}f' cli 
+0

字符'<,>'沒有什麼特別之處。你的第一個awk嘗試通過在GNU awk或GNU sed中轉義它來轉義它成爲一個字邊界來轉義它''''特殊的「。不要考慮使用getline,除非你知道awk更好,請參閱http://awk.freeshell.org/AllAboutGetline。 –

+1

@EdMorton謝謝。 –

回答

4

基本AWK範圍不工作,因爲圖案CLI>在開始範圍以及因此引起AWK僅第一行之後停止打印被發現。

可以掛靠的正則表達式打印全系列:

awk '/ CLI>log/,/ CLI>$/' input.txt 

RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 

否則用awk,你也可以做:

awk 'p &&/CLI>/{print; p=0}/CLI>log/{p=1} p' input.txt 

此命令使用一個切換標誌p決定是否打印或不。當我們將CLI>log排成一行時,p設置爲1。我們繼續打印,直到我們得到下一個CLI>文本,而p==1。一旦我們得到它,我們只需打印結束行並將p設置爲0,以便我們停止打印。

+0

嗨Anubhava,謝謝...你能告訴我爲什麼基本awk範圍不工作? 'awk'/ pat1 /,/ pat2 /'file'也對你的解決方案有一些描述? –

+1

在關於範圍的答案中添加了解釋。 – anubhava

+1

感謝您的幫助。儘管如果您將解釋添加到您的解決方案,那麼它會非常有幫助。 –

相關問題