我需要一个能够匹配的正则表达式:
我必须搜索bash
成千上万的源代码文件,拼写错误的变量。
具体来说,我正在搜索的单词是FrontEnd
,在我们的编码风格指南中,可以根据具体情况以两种方式编写:
FrontEnd (F and E upper)
frontend (all lower)
所以我需要“捕捉”任何不符合我们编码标准的事件:
frontEnd
FRONTEND
fRonTenD
我一直在阅读这个特定示例的许多正则表达式教程,我找不到一种方法来说“匹配这个模式但是如果它恰好是这个或另一个那么就不匹配”。
我想这类似于尝试匹配“000000到999999之间的任何数字,除了数字555555或数字123456”,我认为逻辑是相似的(当然我也不打算这样做) :))
日Thnx
补充评论:
我无法使用grep
管道grep -v
,因为我可能会错过线条;例如,如果我这样做:
grep -i frontend | grep -v FrontEnd | grep -v frontend
会错过这样的一行:
if( frontEnd.name == 'hello' || FrontEnd.value == 3 )
因为第二次出现会隐藏整条线。因此,我正在寻找一个与egrep
一起使用的正则表达式,能够完成我需要的完全匹配。
答案 0 :(得分:1)
您无法使用egrep
轻松完成此操作,因为它不支持前瞻。使用perl可能最容易做到这一点。
perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;'
使用stdin
这是如何运作的:
perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;'
^ ^^ ^ ^ ^ ^ ^ ^ ^ The pattern that matches both the correct and incorrect versions.
| || | | | | | | This switch turns on case insensitive matching for the rest of the regular expression (use (?-i) to turn it off) (perl specific)
| || | | | | | The pattern that match the correct versions.
| || | | | | Negative forward look ahead, ensures that the good stuff won't be matched
| || | | | Begin regular expression match, returns true if match
| || | | Begin if statement, this expression uses perl's reverse if semantics (expression1 if expression2;)
| || | Print content of $_, which is piped in by -n flag
| || Evaluate perl code from command line
| | Wrap code in while (<>) { } takes each line from stdin and puts it in $_
| Perl command, love it or hate it.
答案 1 :(得分:0)
这确实应该是评论,但是有什么理由你不能使用sed
吗?我在想像
sed 's/frontend/FrontEnd/ig' input.txt
当然,假设您想要更正不正确的版本......