我正在尝试编写一个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个时,这些似乎没问题。
提前感谢您的帮助!
答案 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 匹配。
至于为什么你的方法不起作用:
\
,从而改变它。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 {} \;