【问题标题】:Finding files that match regex查找匹配正则表达式的文件
【发布时间】:2016-01-14 01:17:42
【问题描述】:

所以,我正在尝试编写一个 shell 脚本来查找当前目录中与作为我的脚本参数给出的固定正则表达式模式(在基本正则表达式中)匹配的所有文件。

我想出的是:

find ./ -maxdepth 1 -type f -regex "\.\/"$1""

我在开头有那些 ./ 因为 find 命令会找到我的文件并以 ./files 格式打印它们。

如果我为脚本提供参数 a.*,则该命令有效,但如果我尝试为它提供类似 [0-9]\{2\}[a-zA-Z]* 之类的内容来查找我所有开始的文件使用 2 位数字,后跟字母,没有任何反应,我发现它与转义特殊字符有关,但我似乎无法理解为什么以及如何正确地做到这一点......

【问题讨论】:

  • 你觉得$1在这里做什么?
  • 大概这一行在某个脚本或函数中。当你通过它时,你是否引用了这个论点? your_func '[0-9]\{2\}[a-zA-Z]*'
  • 我没有引用这个论点,但即使我这样传递它似乎也不起作用,嗯,$1 被替换为论点,但我没有在我想脚本

标签: regex shell


【解决方案1】:

应该引用你传递的参数,否则它可能会在传递之前被 shell 全局扩展。此外,您将失去\,因为shell 会将\{ 之类的内容扩展为{

您还应该像这样引用您的论点$1

find_regex() {
    find ./ -maxdepth 1 -type f -regex "\./$1"
}

# usage: find_regex '[0-9]\{2\}[a-zA-Z]*'

这匹配文字.,后跟/,然后是传递给函数的参数。您在问题中使用它的方式意味着 $1 在双引号之外,因此您将受到全局扩展和第二次丢失斜线的影响。

【讨论】:

  • {} 是否存在于所有版本的 find 中?因为我的测试用例似乎并不“喜欢”它。在任何转义模式中。
  • 只有部分版本支持-regex开关,根据GNU find docs,支持POSIX基本正则表达式。所以\{N\} 应该理解为N 的出现次数。
【解决方案2】:

我猜这是因为您的文件名以数字开头。

尝试运行:

 find ./ -depth 1

看看你得到的路径。特别是在 find 联机帮助页中,请注意:

这是整个路径上的匹配,而不是搜索

所以你应该假设隐含的^$ 锚。

你可能想要这样的东西:

find ./ -depth 1 -regex "\./[0-9][0-9][A-Za-z]*"

我对@9​​87654326@ 作为量词没有任何兴趣,所以选择了更简单的有效答案。这可能取决于find 的不同版本。

或者,我可能会建议退出 perl,尤其是当您只遍历一个级别时:

perl -e 'print join "\n", grep {m/^\d{2}/} glob ( "*" ) '

这使用了微妙不同的 perl grep,它只匹配文件名(从 * 扩展)。

或者你可以添加一个路径:

perl -e 'print join "\n", grep {m,/\d{2},} glob ( "./*" )'

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多