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