正则表达式:查找不以特定前缀开头的字符串

时间:2013-10-07 19:20:21

标签: regex grep

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

例如。

我想找到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

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

6 个答案:

答案 0 :(得分:1)

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

以下是grep解决方案,但未使用-P开关(perl喜欢正则表达式):

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

以下是grep使用-P切换和negative lokbehind

的解决方案
grep -P '(?<!^CMD_DO\(")APP_PERFORM_TASK' file

答案 1 :(得分:0)

尝试在正则表达式中使用NegativeLookBehind (?!)替换NegativeLookAhead (?<!)

(?<!CMD_DO\(")APP_PERFORM_TASK

检查此操作here

答案 2 :(得分:0)

试试这个

(?!CMD_DO\(").*APP_PERFORM_TASK.*

答案 3 :(得分:0)

这是一个快速的方法:

使用--invert-match(也称为-v)标志忽略CMD_DO并将结果传递给仅与BLAH匹配的第二个grep:

grep -v CMD_DO dummy | grep BLAH

答案 4 :(得分:0)

要处理包含所需和不需要的形式的输入行,例如:

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

你需要在awk中使用这样的东西(使用GNU awk for gensub()):

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

即。摆脱所有不必要的字符串,然后测试剩下的。

答案 5 :(得分:0)

awk版本

awk '/APP_PERFORM_TASK/ && !/^CMD_DO/' file