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

时间:2015-04-10 12:31:48

标签: regex bash grep fortran comments

我想要匹配哪些模式?

我想找到文字常量整数(例如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

我认为这意味着&#34;&lt;&#34;被解释为&#34;管道输入从文件到右边&#34;,所以我尝试用egrep ^[^\!]*\<[0-9]\> MWE.f转义边界字符。不幸的是,这个命令与任何一行都不匹配。

提前感谢您的帮助!

附录:为什么我这样做?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

作为一般规则,请使用单引号引用字符串文字,以避免它们被shell解释。

顺便说一下,grep -E由POSIX指定,应该使用而不是egrep,不推荐使用。{/ p>