Regex 使用grep的正则表达式不起作用(尤其是\d+)
我正试图编写一个bash脚本,从文件夹中选择特定的数据文件,以便从中绘制绘图。我正在尝试编写一个bash脚本,它使用grep来实现这一点。此时,我正在使用正则表达式将ls-1的结果传输到grep中,以生成文件名列表。下面是我正在排序的文件名,此模式继续。粗体是我希望与正则表达式匹配的名称:ifront。\d+ ifrontThermal64.00490Regex 使用grep的正则表达式不起作用(尤其是\d+),regex,grep,filenames,Regex,Grep,Filenames,我正试图编写一个bash脚本,从文件夹中选择特定的数据文件,以便从中绘制绘图。我正在尝试编写一个bash脚本,它使用grep来实现这一点。此时,我正在使用正则表达式将ls-1的结果传输到grep中,以生成文件名列表。下面是我正在排序的文件名,此模式继续。粗体是我希望与正则表达式匹配的名称:ifront。\d+ ifrontThermal64.00490 IFRONTHERMAL64.00490.HeI ifrontThermal64.00490.高 ifrontThermal64.00490.H
IFRONTHERMAL64.00490.HeI
ifrontThermal64.00490.高
ifrontThermal64.00490.HI
ifrontThermal64.00490.放射性通量
ifrontThermal64.00490.雷达天线
ifrontThermal64.00490.u
ifrontThermal64.00490.uNoncool
ifrontThermal64.00500
ifrontThermal64.00500.HeI
ifrontThermal64.00500.高
ifrontThermal64.00500.HI
ifrontThermal64.00500.放射性通量
ifrontThermal64.00500.radTens
ifrontThermal64.00500.u
IFRONTHERMAL64.00500.uNoncool 这些命令不返回任何内容
$ (ls -1)|(grep ifrontThermal64.\d+)
$ (ls -1)|(grep ifrontThermal64\.\d+)
$ (ls -1)|(grep ifrontThermal64.[0-9]+)
这些命令返回我期望的,但不是我想要的
$ (ls -1)|(grep ifrontThermal64.)
$ (ls -1)|(grep ifrontThermal64.[0-9])
当我测试3个在这些方面不起作用的时候,它们似乎是好的
提前感谢您的帮助 如果感兴趣的数字后缀是固定长度的,而您所关心的只是过滤掉具有附加扩展名的文件,那么下面的glob(不是正则表达式,而是通配符表达式)就可以了: 例如: 请注意,glob始终与整个文件名匹配,而默认情况下,
grep
执行子字符串匹配
至于你的方法不起作用的原因:
- 您的正则表达式没有被引用,因此shell的解析“吃掉”了
,从而改变了它\
- 此外,
是否识别grep
取决于平台;要排除此类问题,请改用\d
[0-9]
- 如果使用
而不使用grep
,它将使用所谓的基本正则表达式,这要求将量词-E
转义为+
;虽然可以这样做,但通常更好的选择是使用\+
,或者简单地调用grep-E
作为grep
,以便使用扩展正则表达式,它们的行为与其他语言中的正则表达式类似egrep
,当打算作为文本时,应该在正则表达式中转义(您在一次尝试中就这样做了)- 当
未输出到终端时,暗示了ls
的ls
选项-1
默认情况下使用子字符串匹配,因此使用grep
匹配整个输入行(或者,使用锚定-x
和^
),以排除与表达式匹配但具有附加扩展名的文件名$
ls | egrep -x 'ifrontThermal64\.[0-9]+'
顺便说一句:把命令括在括号里没有意义;您将不必要地创建子shell(除非对它们进行了优化,但关键是它们不是必需的)。您可以将regex与
egrep一起使用,它使用扩展的regex
ifrontThermal64.\d+$
$
是标识字符串结尾的锚点
对于您的情况,无需按照步骤进行绘制。
你可以用
find . -name 'ifrontThermal64.\d+$' -exec plot {} \;
请注意,regexpal.com测试的是JavaScript
正则表达式,而不是bash
正则表达式。您可以只使用{5}
,而不必重复自己的操作。另外,最好避开
@KendallFrey:这是一个glob(通配符表达式),而不是regex。像{5}
这样的间隔(边界)不起作用,而且
不是一个特殊字符。哦,我没有太多使用grep,我还以为它使用了regexS@KendallFrey:grep
确实使用正则表达式(默认情况下称为基本正则表达式,当使用-E
或asegrep
调用grep
时称为扩展正则表达式),但我的全局绑定解决方案基于shell路径名扩展,它使用globs(也称为[filename]模式、通配符表达式),它们与正则表达式只有很遥远的联系,但有一些基本的区别。@KendallFrey:除非你仍然认为我的答案和评论有问题,否则我建议我们都删除我们的评论,以免分散未来读者的注意力-一旦我看到你的评论被删除,我会删除我的评论。
ifrontThermal64.\d+$
find . -name 'ifrontThermal64.\d+$' -exec plot {} \;