Regexp用于匹配文件名

时间:2014-08-06 14:11:26

标签: 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\.log$" 

提前感谢您的帮助

编辑:

$ FILE_PATTERN稍后用于:

find /somefolder -type f -name $FILE_PATTERN

编辑:此FILE_PATTERN位于属性文件中,稍后由bash脚本使用。

5 个答案:

答案 0 :(得分:2)

您需要将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)$'

答案 1 :(得分:1)

$ 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$\)'

答案 2 :(得分:1)

如果您在bash,我假设您必须grep。使用grep -Eegrep将允许您使用替换(ORing您的搜索)

$ stat * | egrep "(error|second)"
File: `first.error.log'
File: `second1.log'
File: `second2.log'

您可以使用ls代替stat,但有时ls不会提供您预测的内容。但考虑到您只搜索文件名,ls就足够了。

$ ls | egrep "(error|second)"
first.error.log
second1.log
second2.log

您可以使用命令替换将输出存储到bash变量中:

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

答案 3 :(得分:1)

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[@]}" ')'

答案 4 :(得分:0)

你很亲密,只有几个错位的符号。

这是我想出的:

.*\.error\..*|^second.*\.log$|.*FF[Pp][Cc]\.log$

这是您的正则表达式的工作修改演示: http://regex101.com/r/rL3rM1/1