使用grep正则表达式忽略行末注释

3

我正在尝试使用grep在很多旧的PowerBASIC源文件中搜索变量,但是我在尝试排除匹配行末注释中变量引用时遇到了困难。

例如:

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个回答

2

你可以先删除注释:

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

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


我甚至没有想到代码中的字面字符串。好发现! - Vilhelm Gray

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

这只匹配左侧不包含 ' 的行,直到 ANGLE。如果字符串中有撇号,它将会遇到类似于 jnylen的解决方案 的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接