正则表达式-匹配一个字符串而不匹配同一行中的另一个字符串

时间:2020-06-10 11:32:43

标签: regex shell awk sed grep

我正在学习正则表达式。我试图在文件中打印包含特定字符串但不包含其他字符串的行。

文件中有几行

k 1 : abcd
jkjkj
l 1 : efgh
kjkjk
m 1 : abok
lklk

我的意图是将行与1 :匹配,而不将ab与同一行匹配。

我想要的输出应该是1 : efgh(此行与1 :匹配,并且此行不包含ab)。

为此,我尝试使用正则表达式^((?!ab).*1 :*)*$。但这是行不通的。有人可以指出我的表达方式在哪里吗?

2 个答案:

答案 0 :(得分:1)

如注释中所述,

该Shell不支持超前。 您可以通过grep之类的其他程序来传递文本,以获得所需的正则表达式风格(即perl)

cat test.txt | grep --perl '1\s:(?!.*ab)'

返回

l 1 : efgh

答案 1 :(得分:1)

如果您需要整行,请使用awk

awk !/ab/'  && '/1[[:space:]]:/ inputfile > outputfile

它输出不包含ab且包含1 +空格+ :的行。

要获得一行的一部分:

sed -E -n '/ab/!s/.*(1 :.*)/\1/p' inputfile > outputfile

跳过所有包含ab的行,并使用-n + p选项/标志提取捕获组值。