Regex 使用grep的正则表达式不起作用(尤其是\d+)

Regex 使用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

我正试图编写一个bash脚本,从文件夹中选择特定的数据文件,以便从中绘制绘图。我正在尝试编写一个bash脚本,它使用grep来实现这一点。此时,我正在使用正则表达式将ls-1的结果传输到grep中,以生成文件名列表。下面是我正在排序的文件名,此模式继续。粗体是我希望与正则表达式匹配的名称:ifront。\d+

ifrontThermal64.00490
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
或as
egrep
调用
grep
时称为扩展正则表达式),但我的全局绑定解决方案基于shell路径名扩展,它使用globs(也称为[filename]模式、通配符表达式),它们与正则表达式只有很遥远的联系,但有一些基本的区别。@KendallFrey:除非你仍然认为我的答案和评论有问题,否则我建议我们都删除我们的评论,以免分散未来读者的注意力-一旦我看到你的评论被删除,我会删除我的评论。
ifrontThermal64.\d+$
find . -name 'ifrontThermal64.\d+$' -exec plot {} \;