grep regex忽略行尾的注释

时间:2013-05-23 16:22:39

标签: regex grep basic non-greedy powerbasic

我正在尝试通过大量旧的PowerBASIC源文件来搜索变量,但是我无法让grep避免在行尾注释中匹配对变量的引用

例如:

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

但是 - 除了忽略没有注释的行之外 - 它还打印出完全不使用ANGLE的代码行(例如DELTA行)。这是因为这些行恰好在他们的评论中有一个撇号(')(即AREN'T)。

我想管道输出以删除我不想要的行:

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

但不幸的是,它还删除了我想要的代码行,恰好在他们的评论中有“ANGLE”。

如何让grep与涉及ANGLE的实际代码行匹配,并在注释中忽略匹配的那些行?

2 个答案:

答案 0 :(得分:2)

你可以先拿出评论:

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

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

答案 1 :(得分:2)

grep "^[^']*\bANGLE\b" SRC_FILE.BAS

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