使用 grep 查找未注释的文字整数

Using grep to find uncommented literal integers

我要匹配什么模式?

我想查找文字常量整数(例如 4、8、15),但如果它们在注释(例如 !4)或变量名的一部分(例如 myvar4)中则不行。我正在搜索的文件的语言是 Fortran,所以注释符号是“!”。这是一个名为 "MWE.f":

的文件
j = j + 1      ! <-- match this
!j = j + 1     ! <-- do NOT match this
j1 = j1 + j2   ! <-- do NOT match this

我尝试了什么?

命令 egrep ^[^\!]*[0-9] MWE.f 按预期匹配第一行,但它也匹配第三行。因此,我尝试使用 egrep ^[^\!]*<[0-9]> MWE.f 添加单词边界,但此命令会引发以下错误:

-bash: [0-9]: No such file or directory

我认为这意味着“<”被解释为 "pipe input from the file to the right",因此我尝试使用 egrep ^[^\!]*\<[0-9]\> MWE.f 转义边界字符。不幸的是,此命令与任何行都不匹配。

在此先感谢您的帮助!

附录:我为什么要这样做?

为了避免代码中出现数值问题,我想指定每个文字常量的类型。为了简单起见,我在这个例子中使用了整数。一旦我弄清楚了整数,我将把它扩展到浮点类型。然后我应该能够找到任何单精度(4 字节)实数并将它们更改为双精度(8 字节)实数。

在我看来,您的问题只是您的模式周围缺少引号:

grep -E '^[^!]*\<[0-9]+\>' file

对我来说很好,匹配你的三行中的第一行。您还可以删除转义 ! 的反斜杠,因为不再有任何风险将 shell 解释为历史扩展。我还添加了一个 + 以便匹配多位常量。

作为一般规则,用单引号引用您的字符串文字以避免它们被 shell.

解释

顺便说一句,grep -E 由 POSIX 指定,应该用来代替 egrep,后者已被弃用。