正则表达式与 ls 的用法

Posted

技术标签:

【中文标题】正则表达式与 ls 的用法【英文标题】:Regular Expression usage with ls 【发布时间】:2013-02-27 01:31:21 【问题描述】:

我正在尝试将 ER (扩展正则表达式)ls 一起使用,例如 ls .+\..+

我正在尝试打印所有包含扩展名的文件 (我知道我可以使用 ls *.*,但我想尝试使用 ER)。

当我运行该代码时,我收到此错误:ls: .+..+: No such file or directory

【问题讨论】:

我认为您混淆了 RE 和 shell 通配符。答案还取决于她将使用什么。 所以我不能在ls中使用RE? 除非你为 ls 使用一些花哨的、非标准的脚本,否则 ls 不使用正则表达式。此外,操作系统将在传递给您的命令之前处理特殊的通配符,如 *。尝试改用“查找” echo $SHELL /bin/bash Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 【参考方案1】:

您没有说您使用的是什么 shell,但它们通常不支持这种方式的正则表达式,尽管有常见的 *nix CLI 工具(grepsed 等)可以支持。

像 bash 这样的 shell 支持的是 globbing,它使用了一些相似的字符(例如,*)但不是一回事。

较新版本的 bash 确实有一个正则表达式运算符 =~:

for x in `ls`; do 
    if [[ $x =~ .+\..* ]]; then 
        echo $x; 
    fi; 
done

【讨论】:

酷!我从来没有听说过! :) 所以它只使用=~ 并且解释器会明白我要匹配的是RE? 您必须在 test 的上下文中使用它,我相信使用双括号,因此对于这种特定情况,通过 (e)grep 进行管道更直接。但了解一下很有用。 这是一个专门的 bash 比较运算符,这就是为什么它只能在测试中使用。为了清楚起见,只需提及这一点。非常有用的工具。【参考方案2】:

您将正则表达式与shell globbing 混淆了。如果你想使用正则表达式来匹配文件名,你可以这样做:

$ ls | egrep '.+\..+'

【讨论】:

知道了。因此,首先我必须检查我尝试使用的内容是否接受 RE。 如果模式不能单独与globbing 匹配,那么您将不得不使用另一种方法。 F.Y.I 工具find 支持正则表达式匹配。 如果文件列表很长,ls -f 可能会更快。 shellcheck 显示“使用 find 而不是 ls 来更好地处理非字母数字文件名。请参阅 SC2012。”对于ls 和“egrep 是非标准且已弃用。请改用 grep -E。请参阅SC2196。”对于egrep

以上是关于正则表达式与 ls 的用法的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式语法与正则表达式在iOS中的常见用法

深入理解正则表达式环视的概念与用法

grep用法详解:grep与正则表达式 [转]

Linux文本过滤搜索器grep与egrep的常用正则表达式与用法

grep用法

通配符正则表达式的记录