2017-07-27 25 views
0

需要關於bash腳本的一部分的幫助,它需要找到特定的模式字符串。樣本字符串如下:搜索字符串的組合和模式

//*----------- 
//* %%SET %%ABC  = %%BLANK 
//* %%SET %%RESTART = %%BLANK7 
//* %%SET %%DANGO= 236985 
//*----------- 
//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 
//*----------- 
//* %%IF %%ODATE EQ 463123 
//* %%SET %%DANGO= 236985 
//* %%ENDIF 
//*----------- 
//* %%IF %%ODATE EQ 15641 
//* %%SET %%RESTART = %%BLANK7 
//* %%ENDIF 
//*----------- 
  • 我需要找到大館,ABC,一個IF內重新啓動,並ENDIF條件
  • 我specificly需要檢查beween IF和ENDIF的組合。還應該檢查IF和ENDIF之間存在三個參數ODATE,ABC和RESTART的情況。如果條件滿足,則應打印這些條件。
  • 我想下面的命令

貓文件| SED -n '/ %% IF /,/ %% ENDIF/P'

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 
//* %%IF %%ODATE EQ 463123 
//* %%SET %%DANGO = 236985 
//* %%ENDIF 
//* %%IF %%ODATE EQ 15641 
//* %%SET %%RESTART = %%BLANK7 
//* %%ENDIF 

我只需要下面發現:

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 

我怎麼能做到這一點?

回答

0

使用sed:

sed -n '/%%IF /{:a;N;/%%ENDIF/!ba;/ODATE/{/ABC/{/RESTART/p;}}}' file 
0

您可以使用下面的命令awk

awk '/%%ODATE EQ 123456/{p=1}/ENDIF/&&p{p=0;print}p' file 

輸出:

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 

基本上awk打印一行這裏當變量p是真實的。 p將設置爲當行ODATE EQ 123456出現並重置在下一個ENDIFENDIF本身也會打印出來。


按照下面的評論,你可以使用這個命令:

awk '/IF/&&/ABC/&&/RESTART/' RS='\n//\\*---+\n' 

這裏的關鍵是記錄分隔RS

+0

謝謝你的快速答覆。但是從ODATE號碼中過濾出來,我們可以在IF和ENDIF之間進行具體檢查。還應該檢查IF和ENDIF之間存在三個參數ODATE,ABC和RESTART的情況。 –

+0

您可以使用以下命令'awk'/ IF/&&/ABC/&&/RESTART /'RS ='// \\ * --- + \ n'' – hek2mgl

+0

謝謝。這是魔術。 –