【问题标题】:grep regex to ignore comment at end of linegrep 正则表达式忽略行尾的注释
【发布时间】:2013-05-23 16:22:39
【问题描述】:

我正在尝试通过大量旧 PowerBASIC 源文件 grep 来搜索变量,但我无法获取 grep 以避免匹配行尾 cmets 中对变量的引用。

例如:

ANGLE = 40    ' THIS IS A COMMENT ABOUT ANGLE'S VALUE
FOO = 3/ANGLE ' ANGLE CAN APPEAR ON RIGHT SIDE AS WELL
DELTA = 35    ' ANGLE AND DELTA AREN'T FRIENDS

最初我使用的是:

# grep "\bANGLE\b.*'" SRC_FILE.BAS

但是——除了忽略没有 cmets 的行——它还会打印出根本不使用ANGLE 的代码行(例如DELTA 行)。这是因为这些行在其 cmets(即AREN'T)中也恰好有一个单个撇号(')。

我想通过管道输出来删除我不想要的行:

# grep "\bANGLE\b" SRC_FILE.BAS | grep -v "'.*\bANGLE\b"

但不幸的是,它也删除了我确实希望他们的 cmets 中恰好有“ANGLE”的代码行。

如何让 grep 匹配涉及 ANGLE 的实际代码行,并忽略 cmets 中 only 匹配的那些行?

【问题讨论】:

    标签: regex grep basic non-greedy powerbasic


    【解决方案1】:
    grep "^[^']*\bANGLE\b" SRC_FILE.BAS
    

    这仅匹配 ANGLE 左侧的所有内容不包括 ' 的行。如果字符串中有撇号,则会出现类似于jnylen's solution 的问题。

    【讨论】:

      【解决方案2】:

      你可以先把cmets拿出来:

      sed "s/'.*$//" SRC_FILE.BAS | grep '\bANGLE\b'
      

      在某些情况下,如果字符串包含单词 ANGLE 或单引号,这仍然会失败。要准确解决这个问题,您需要编写解析器而不是使用正则表达式。

      【讨论】:

      • 我什至没有想到代码中的文字字符串。好收获!
      猜你喜欢
      • 2020-10-26
      • 2018-08-24
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多