grep的。不以“abcd”结尾的文本行?

时间:2011-05-15 02:31:01

标签: regex sed grep

您好我正在寻找一个正则表达式:文本行不以某个单词结尾,让我们说它是“abcd”
起初我试过用 .*[^abcd]$
那当然不起作用。它匹配一条不以字母a,b,c或d结尾的行 因此,在高级Grep主题中,我找到了这个表达式,但无法使其工作:
^(?>.*)(?<=abcd)
- &GT;
grep -e "^(?>.*)(?<=abcd)$"

我需要表达的任何想法吗?

3 个答案:

答案 0 :(得分:26)

看一下Grep的-v选项

grep -v 'abcd$'

如果你的意思是单词而不仅仅是“字符序列”,那么请使用

grep -v '\babcd$'

\b意为“字边界”

答案 1 :(得分:3)

试一试:

grep -v "\<abcd\>$"

概念证明

$ printf "%s\n" "foo abcd bar baz" "foo bar baz abcd" "foo bar bazabcd" | grep -v "\<abcd\>$"
foo abcd bar baz
foo bar bazabcd

注意:这将匹配整个单词,正如第3行被返回的事实所指出的那样,即使它包含abcd作为最后4个字母< / p>

答案 2 :(得分:1)

使用grep标志时,

-P支持PCRE正则表达式。

grep -e "^(?>.*)(?<=abcd)$"不起作用的原因之一是因为您使用的外观是正面的,这意味着与所需内容完全相反。 (?<=是正向lookbehind的语法,它告诉正则表达式引擎使用abcd搜索结束的行。

要搜索不以某些字符串结尾的行,您需要使用负向lookbehind。负面后瞻的语法是(?<!。因为负面的后视包含感叹号,bash会尝试将其解释为事件,所以不能使用双引号将{regex}提供给grep

我使用以下正则表达式搜索不以log结尾的行。

grep -P '(?<!log)$' < <inputfile>

同样,您可以使用上述命令并将log替换为您想要匹配的任何模式。

此正则表达式可用于不支持反向匹配的其他程序,例如-v的{​​{1}}选项