如何编写一个grep正则表达式,使得某个字符串不会出现在当前行上匹配模式之前的任何位置?

时间:2012-04-20 15:21:40

标签: regex grep

我正在尝试查找所有语句实例,例如

             ABCD.Transaction = GlobalCommArea 
      WXY.Transaction = GlobalCommArea 
         PQR.Transaction = LMN.Transaction
    DEF.XYZ(CStr(i)).Transaction = GlobalCommArea

我唯一想避免的是在任何这些陈述之前存在单引号。

所以,例如。

      ' PQR.Transaction = GlobalCommArea  

无效,但

       WXY.Transaction = GlobalCommArea ' 2012  

是有效的,因为引用来自行

上的匹配部分

如果单引号问题不存在,我可以写一个简单的正则表达式如下 -

      grep -nr  "\.Transaction" .

如何编写一个正则表达式,可以确保在匹配前的任何地方都没有单引号?

2 个答案:

答案 0 :(得分:1)

grep -nrE "^[^']+\.Transaction"

答案 1 :(得分:0)

不确定你正在使用哪种grep,但GNU grep 2.9(在我的Ubuntu盒子上)会这样做(-P开关打开PCRE,所以前瞻工作):

grep -P "^(?! *').+Transaction.+$" file_to_search.txt

说明:

^              # start at beginning of line
(?! *')        # negative lookahead for optional space and a single quote
.+Transaction  # one or more characters up to 'Transaction'
.+$            # all remaining character up to end of line

编辑:显示在cygwin上工作

$ uname -r        
1.7.11(0.260/5/3)   # cygwin ver. 1.7.11

$ grep --version
GNU grep 2.6.3

$ cat foo.txt       # contents of the file I'm grepping
  ABCD.Transaction = ' GlobalCommArea
'   WXY.Transaction = GlobalCommArea
  PQR.Transaction = LMN.Transaction
     '  DEF.XYZ(CStr(i)).Transaction = GlobalCommArea

$ grep -P "^(?! *').+Transaction.+$" foo.txt
ABCD.Transaction = ' GlobalCommArea
PQR.Transaction = LMN.Transaction