【问题标题】:Regex: Find files not ending with numeral suffix正则表达式:查找不以数字后缀结尾的文件
【发布时间】:2017-04-06 10:12:07
【问题描述】:

我需要创建一个返回所有不带数字后缀(*.0、*.123、...)的文件的命令

例如有三个文件:

gg.p  qqq.449  rtr55

我只想找到这些:

./rtr55
./gg.p

我尝试使用 grep 找到它们。但是我只得到了没有效果的结果。

find -type f | grep -v '\.[0-9]+$'

(此命令返回:)

./qqq.449
./rtr55
./gg.p

所以可能存在一些正则表达式格式错误。你知道怎么解决吗?

【问题讨论】:

  • 试试grep -v '\.[0-9]\+$'

标签: regex shell unix


【解决方案1】:

+ 运算符属于扩展正则表达式。有很多解决方法:

find -type f | grep -v '\.[0-9]\+$'
find -type f | egrep -v '\.[0-9]+$'
find -type f | grep -E -v '\.[0-9]+$'
find -type f | grep -v '\.[0-9][0-9]*$'

【讨论】:

    【解决方案2】:

    你为什么要使用grep

    find -regex '.*\.[0-9][0-9]*' -prune -o -type f
    

    如果您的表达式足够简单(或者您的find 不支持-regex),您可以使用-name 而不是-regex,但全局通配符无法在点。这里有一两个:

    find -name '*.[0-9]' -prune -o -name '*.[0-9][0-9]' -prune -o -type f
    

    请注意,这不仅仅是一个效率问题;如果您遇到带有换行符的文件名,grep 根本不会做正确的事情。

    【讨论】:

    • MacOS 上find 中的正则表达式支持不支持[0-9]+,所以我输入了一个稍微麻烦一点的表达式。我猜在 Linux 上您可能可以使用加号量词,但请注意它不可移植。
    • 我试过 find -regex '.*\.[0-9][0-9]*' -prune -o -type f,但它对数字返回没有影响。此外 -regex 选项可能不符合标准。当我将它粘贴到 SunOS 时,它无法识别 -regex 选项。
    • 已更新为仅使用 -name 的版本。
    猜你喜欢
    • 2022-01-09
    • 2019-02-21
    • 2019-04-10
    相关资源
    最近更新 更多