在方括号外面打印带有图案的线条

时间:2014-11-01 04:27:13

标签: regex bash awk grep

美好的一天,

我想知道如何打印包含方括号内外数据的行。但是,这种模式只能在方括号之外找到。

模式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不感兴趣。再次感谢。

3 个答案:

答案 0 :(得分: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 符号。

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

(?!.*\[[^\[\]]*lipsum2[^\[\]]*])

lipsum2否定前瞻声明[]括号内没有字符串lipsum2。在这种情况下,正则表达式引擎会匹配包含[](不在{{1}})字符串中的行。

答案 1 :(得分:1)

问题很模糊,但这样做会

awk '$NF ~ /lipsum2/'

答案 2 :(得分: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 [^][]

其余的是自我解释