正则表达式与 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 工具(grep
、sed
等)可以支持。
像 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 的用法的主要内容,如果未能解决你的问题,请参考以下文章