我想在字符串中找到一个单词,但前提是不以前缀开头。
例如。
我想找到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
但这并不能产生我需要的结果。我做错了什么?
答案 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