2

我想在字符串中找到一个单词,但前提是它不以前缀开头

例如。

我想找到 APP_PERFORM_TASK 的所有外观,但前提是它们不是以前缀 CMD_DO("

所以,

CMD_DO("APP_PERFORM_TASK")   <- OK (i don't need to know about this)  
BLAH("APP_PERFORM_TASK")     <-- NOT OK, this should match my search.

我试过了:

(?!CMD_DO\(")APP_PERFORM_TASK

但这不会产生我需要的结果。我做错了什么?

4

6 回答 6

1

尝试在您的正则表达式中将NegativeLookAhead 替换(?!)为 NegativeLookBehind(?<!)

(?<!CMD_DO\(")APP_PERFORM_TASK

在此处检查此操作

于 2013-10-07T19:30:36.197 回答
1

根据您的评论:Let's concentrate on command line tool grep

这是grep不使用-P开关的解决方案(perl,如正则表达式):

grep 'APP_PERFORM_TASK' file | grep -v '^CMD_DO("'

这是grep使用-Pswitch 和的解决方案negative lokbehind

grep -P '(?<!^CMD_DO\(")APP_PERFORM_TASK' file
于 2013-10-07T20:36:03.713 回答
1

这是一个快速的方法:

使用 --invert-match(也称为 -v)标志忽略 CMD_DO 并将结果通过管道传送到仅匹配 BLAH 的第二个 grep:

grep -v CMD_DO dummy | grep BLAH
于 2013-10-07T20:56:20.587 回答
0

尝试这个

(?!CMD_DO\(").*APP_PERFORM_TASK.*
于 2013-10-07T20:00:32.843 回答
0

一个awk版本

awk '/APP_PERFORM_TASK/ && !/^CMD_DO/' file
于 2013-10-08T05:58:53.743 回答
0

要处理具有理想和不理想形式的输入行,例如:

CMD_DO("APP_PERFORM_TASK") BLAH("APP_PERFORM_TASK")

您在 awk 中需要这样的东西(使用 GNU awk 进行 gensub()):

awk -v s="APP_PERFORM_TASK" 'gensub("CMD_DO\\(\\""s,"","") ~ s' file

即去掉所有不需要的字符串,然后测试剩下的内容。

于 2013-10-08T00:08:17.137 回答