使用grep工作的正则表达式(特别是\ d +)

时间:2014-05-09 01:54:20

标签: regex grep filenames

我正在尝试编写一个bash脚本来从文件夹中挑选出特定的数据文件,以便我可以从中创建绘图。我正在尝试编写一个使用grep执行此操作的bash脚本。此时,我使用正则表达式将结果从ls -1传递到grep,以生成文件名列表。以下是我正在排序的文件名,这种模式仍在继续。粗体的是我想要与正则表达式匹配的名称:ifrontThermal。\ d +

  

ifrontThermal64.00490
  ifrontThermal64.00490.HeI
  ifrontThermal64.00490.HeII
  ifrontThermal64.00490.HI
  ifrontThermal64.00490.radFlux
  ifrontThermal64.00490.radTens
  ifrontThermal64.00490.u
  ifrontThermal64.00490.uNoncool
  的 ifrontThermal64.00500
  ifrontThermal64.00500.HeI
  ifrontThermal64.00500.HeII
  ifrontThermal64.00500.HI
  ifrontThermal64.00500.radFlux
  ifrontThermal64.00500.radTens
  ifrontThermal64.00500.u
  ifrontThermal64.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])

当我测试那些在http://regexpal.com/不起作用的3个时,这些似乎没问题。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

如果感兴趣的数字后缀是固定长度的,并且您关心的是过滤掉具有附加扩展名的文件,则以下 glob (不是正则表达式,但是通配符表达式)将做:

ifrontThermal64.[0-9][0-9][0-9][0-9][0-9]

E.g:

printf "%s\n" ifrontThermal64.[0-9][0-9][0-9][0-9][0-9]

请注意,globs始终与整个文件名匹配,而grep默认情况下执行 substring 匹配。

至于为什么你的方法不起作用:

  • 你的正则表达式没有被引用,所以shell解析'吃掉'\,从而改变它。
  • 此外,grep是否认可\d是否与平台有关;要排除此类问题,请改用[0-9]
  • 如果您使用grep 而不使用 -E,则会使用所谓的基本正则表达式,这需要量词{{1} } 转义+;虽然你可以做到这一点,但通常更好的选择是使用\+或简单地调用grep -E作为grep以使用扩展正则表达式,表现得像其他语言中的正则表达式。
  • egrep,如果打算成为文字,应该. - 在正则表达式中进行转义(您在其中一次尝试中进行了转发)。
  • \未输出到终端时,隐含-1 ls选项。
  • 默认情况下,
  • ls使用 substring 匹配,因此请使用grep整个输入行匹配(或者,使用锚点{{ 1}}和-x)以便排除与表达式匹配但具有附加扩展名的文件名。

因此,原始命令的更正版本为:

^

顺便说一句:将命令括在括号中是没有意义的;你将不必要地创建子壳(除非它们被优化掉了,但重点是它们不需要)。

答案 1 :(得分:0)

您可以将正则表达式与egrep一起使用,后者使用扩展正则表达式

ifrontThermal64.\d+$

$是一个标识字符串结尾的锚点。

对于您的情况,无需遵循步骤ls - > egrep - >情节。 你可以使用

find . -name 'ifrontThermal64.\d+$' -exec plot {} \;