我想找到文字常量整数(例如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字节)实数。
答案 0 :(得分:1)
在我看来,你的问题只是你的模式缺少引号:
grep -E '^[^!]*\<[0-9]+\>' file
对我来说很好,匹配你的三行中的第一行。您还可以删除转义!
的反斜杠,因为不再存在将shell解释为历史扩展的风险。我还添加了一个+
,以便匹配多位数的常量。
作为一般规则,请使用单引号引用字符串文字,以避免它们被shell解释。
顺便说一下,grep -E
由POSIX指定,应该使用而不是egrep
,不推荐使用。{/ p>