使用 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
,后者已被弃用。
我要匹配什么模式?
我想查找文字常量整数(例如 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
,后者已被弃用。