用于匹配文件名的Regexp

用于匹配文件名的Regexp,regex,bash,Regex,Bash,我有一个文件: first.error.log second1.log second2.log FFFpc.log TR.den.log bla.error.log 我想创建一个模式,它将匹配所有文件名中有错误的文件+几个附加文件,但仅此而已: 唯一的错误是 $FILE_PATTERN="*.error*" 但如果我不仅要匹配这些错误,还要匹配所有秒数和FFpc等,该怎么办 这不起作用: $FILE_PATTERN="*.error*|^second.*\log$|.*FFPC\.lo

我有一个文件:

first.error.log
second1.log
second2.log
FFFpc.log
TR.den.log
bla.error.log
我想创建一个模式,它将匹配所有文件名中有错误的文件+几个附加文件,但仅此而已:

唯一的错误是

 $FILE_PATTERN="*.error*"  
但如果我不仅要匹配这些错误,还要匹配所有秒数和FFpc等,该怎么办

这不起作用:

$FILE_PATTERN="*.error*|^second.*\log$|.*FFPC\.log$" 
提前谢谢你的帮助

编辑:

$FILE_模式稍后由以下人员使用:

find /somefolder -type f -name $FILE_PATTERN
编辑:此文件\模式位于稍后由bash脚本使用的属性文件中

$ ls | grep -i '\(.*error.*\)\|\(^second.*\log$\)\|\(.*FFPC\.log$\)'
bla.error.log
FFFpc.log
first.error.log
second1.log
second2.log
如果你想使用find

find /somefolder -type f | grep -i '\(.*error.*\)\|\(^second.*\log$\)\|\(.*FFPC\.log$\)'

你很接近,只是有一些符号放错了地方

以下是我的想法:

.*\.error\..*|^second.*\.log$|.*FF[Pp][Cc]\.log$
下面是对正则表达式进行有效修改的演示:

如果你在
bash
我假设你必须
grep
。使用
grep-E
egrep
将允许您使用交替(对搜索进行排序)

您可以使用
ls
而不是
stat
,但有时
ls
无法提供您预测的结果。但考虑到您只搜索文件名,
ls
应该就足够了

$ ls | egrep "(error|second)"
first.error.log
second1.log
second2.log
可以使用命令替换将输出存储到
bash
变量中:

FILE_PATTERN=$(ls | egrep "(error|second)")

您需要将
find
-regex
选项一起使用:

find -E /somefolder -type f -regex '\./(.*\.error.*|second.*log|.*FFPC\.log)$'
PS:使用
-iregex
忽略大小写匹配:

find -E /somefolder -type f -iregex '\./(.*\.error.*|second.*log|.*FFPC\.log)$'

什么命令正在使用
$FILE\u PATTERN
?我不明白您想要匹配什么。你在毫无解释地使用一堆正则表达式和通配符,这是一个传达意图的糟糕想法。如果你使用正确的正则表达式,它会起作用(
表示一个字符,
*
表示一个字符串,
\.
表示一个点)。我编辑了我的问题:)为什么要使用转义括号?@Blindy参考哦有趣,我只在C#:)@Hemang内部使用它,我想如果你使用
egrep
你就不必逃离所有的帕伦斯和帕伦斯pipes@skamazin谢谢你的提示
-E
表示扩展正则表达式。我明白了。我想GNU
find
没有。使用GNU,您可以使用
-regextype
进行操作,其中类型可以是
findutils default
awk
egrep
ed
emacs
GNU-awk
posix-awk
posix-basic
posix-egrep
posix-extended
posix-minimal-basic
sed
@konsolebox:非常感谢您添加关于
gnu-find
的注释。我在OSX上,所以无法使用
gnu
版本的
find
对其进行测试。实际上,主要问题是find命令中的-name而不是-regex,在我更改它之后,其他一切都进行得很顺利,谢谢!是的,这是真的@MateuszChrzaszcz。实际上,您使用的是正则表达式模式,而不是全局模式。
find -E /somefolder -type f -iregex '\./(.*\.error.*|second.*log|.*FFPC\.log)$'
FILE_PATTERN=("*.error*" "second.*log" ".*FFPC.log")
ARGS=(-name "$FILE_PATTERN")
for F in "${FILE_PATTERN[@]:2}"; do
    ARGS+=(-o -name "$F")
done
find /somefolder -type f '(' "${ARGS[@]}" ')'