【问题标题】:Regexp for matching filenames匹配文件名的正则表达式
【发布时间】:2014-08-06 14:11:26
【问题描述】:

我有一个文件:

first.error.log
second1.log
second2.log
FFFpc.log
TR.den.log
bla.error.log

并且我想创建一个模式来匹配文件名中所有有错误的文件+一些其他文件,但仅此而已:

对于唯一的错误,它会是

 $FILE_PATTERN="*.error*"  

但是,如果我不仅要匹配这些错误,还要匹配所有 second 和 FFpc 等呢?

这不起作用:

$FILE_PATTERN="*.error*|^second.*\log$|.*FFPC\.log$" 

提前感谢您的帮助

编辑:

$FILE_PATTERN 稍后被:

find /somefolder -type f -name $FILE_PATTERN

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

【问题讨论】:

  • $FILE_PATTERN正在使用什么命令?
  • 我不明白你想匹配什么。您在没有解释的情况下使用了正则表达式和通配符的混搭,这是传达意图的糟糕主意。如果您使用正确的正则表达式,它将起作用(. 表示一个字符,.* 表示一个字符串,\. 表示一个点)。
  • 我编辑了我的问题 :)

标签: regex bash


【解决方案1】:

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

【讨论】:

  • -E 用于扩展正则表达式。
  • 我明白了。我认为 GNU find 没有。使用 GNU,您可以使用 -regextype <type> 执行此操作,其中类型可以是 findutils-defaultawkegrepedemacsgnu-awkgrepposix-awk、@98765433 posix-egrep, posix-extended, posix-minimal-basic, sed.
  • @konsolebox:非常感谢您添加有关gnu find 的注释。我在 OSX 上,所以无法使用 gnu 版本的 find 对其进行测试。
  • 其实主要的问题是find命令中的-name而不是-regex,我改了之后其他都顺利,谢谢!
  • 是的,这是真的@MateuszChrzaszcz。你所拥有的确实是一个正则表达式模式而不是一个全局模式。
【解决方案2】:
$ 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$\)'

【讨论】:

  • 为什么是转义括号?
  • 哦有趣,我只在 C# 内部使用它:)
  • @Hemang 我认为如果你使用egrep,你就不必逃避所有的括号和管道
  • @skamazin 感谢您的提示!
【解决方案3】:

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

$ 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)")

【讨论】:

    【解决方案4】:
    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[@]}" ')'
    

    【讨论】:

      【解决方案5】:

      你已经很接近了,只是有几个错位的符号。

      这是我想出的:

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

      这是一个对您的正则表达式进行有效修改的演示: http://regex101.com/r/rL3rM1/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-09
        • 2016-06-18
        • 1970-01-01
        • 2019-07-26
        • 2021-07-28
        相关资源
        最近更新 更多