2014-11-01 49 views
-2

美好的一天,在方括號外找到的圖案的打印線

我想知道如何打印包含方括號內部和外部數據的行。但是,該模式只能在方括號外找到。

模式lipsum2

預期輸入

[lipsum1; limpsum6; lipsum1] lipsum2;[lipsum9; limpsum1; lipsum1] lipsum2 
[lipsum1; limpsum7; lipsum1] lipsum3;[lipsum10; limpsum1; lipsum1] lipsum3 
[lipsum1; limpsum2; lipsum1] lipsum4;[lipsum12; limpsum1; lipsum1] lipsum4 
[lipsum1; limpsum2; lipsum1] lipsum5;[lipsum2; limpsum1; lipsum1] lipsum5 

期望輸出

[lipsum1; limpsum6; lipsum1] lipsum2;[lipsum9; limpsum1; lipsum1] lipsum2 

感謝您事先的任何線索這麼多。

注:我對sed不感興趣。再次感謝。

回答

2

你可以試試下面的grep命令,

grep -P 'lipsum2(?![^\[\]]*\])' file 

匹配lipsum2只有當它後面沒有任何字符,但不是那麼[]零次或更多次]象徵。

lipsum2     'lipsum2' 
(?!      look ahead to see if there is not: 
    [^\[\]]*     any character except: '\[', '\]' (0 or 
          more times) 
    \]      ']' 
)      end of look-ahead 

OR

grep -P '^(?!.*\[[^\[\]]*lipsum2[^\[\]]*]).*lipsum2.*' file 

(?!.*\[[^\[\]]*lipsum2[^\[\]]*])負先行斷言有不存在於[]括號內的字符串lipsum2。在這種情況下,正則表達式引擎將匹配包含lipsum2(不在[]之內)的字符串。

+0

感謝太多。它工作順利,我可以問你第一個是如何工作的嗎? – 2014-11-01 04:33:54

1

那麼問題是含糊不清,但是這將做到這

awk '$NF ~ /lipsum2/' 
0
awk '{s=$0; gsub(/\[.[^][]*\]/,"") ; if($0~/lipsum2/) {print s} }' file 

說明:

s=$0 :      Save the current line to variable s because gsub changes $0 
gsub(/\[.[^][]*\]/,"") : Do a global substitution, look for [ till ] but cannot contain [ or ] in between using inversion in character group , eg [^][] 

其餘部分是自我解釋

+2

太感謝了。它正常工作。如果我問你它是如何工作的,會不會太多?對於假人的一點解釋,就是這樣的:) – 2014-11-01 04:42:27