此目录中有许多文件:
[ichen@ui01 data]$ ls
data.list
data.root
ntuple.data15_13TeV.00276262.DAOD_FTAG2.root
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root
ntuple.data15_13TeV.00276336.DAOD_FTAG2.root
ntuple.data15_13TeV.00276416.DAOD_FTAG2.root
ntuple.data15_13TeV.00276511.DAOD_FTAG2.root
我想列出一个列表,其中只包含以下模式的文件:
[many chars].[many chars].[many numbers].[many chars].root
要匹配文件名,例如:
ntuple.data15_13TeV.00276262.DAOD_FTAG1.root
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root
ntuple.data15_13TeV.00276336.DAOD_FTAG3.root
etc...
如何使用regexp实现此目标?
也许我们可以使用以下语法:
for f in `ls`;do if [....];then echo $f;fi;done > log.list
最佳答案
在雷格斯普兰,许多道路通向罗马。:)
ls | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$'
^标记行的开头
$表示一行的结尾
\ w是单词字符
\ W*是许多工作字符
是的。是正则表达式中的字面“.”字符,无掩码“.”表示“任何字符”
[0-9]是介于0和9之间的任何数字
对于您的具体示例:
for f in `ls`;do echo $f | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$';done
现在包括if语句:
for f in `ls`; do if [[ $f =~ '\w*\.\w*\.[0-9]*\.\w*\.root' ]]; then echo $f; fi; done
在本例中,我必须删除行首和行尾(^…$)以使其匹配。不知道为什么。通常,=~将检查正则表达式。
关于regex - 如何在目录中匹配此文件名模式,并输出匹配的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37431671/