【发布时间】:2016-02-08 17:14:21
【问题描述】:
我想搜索一个可能包含 kavi 或 kabhi 的文件名。 我在终端写了命令:
ls -l *ka[vbh]i*
ka 和 i 之间可能存在 v 或 bh。
我写的代码不正确。正确的命令是什么?
【问题讨论】:
我想搜索一个可能包含 kavi 或 kabhi 的文件名。 我在终端写了命令:
ls -l *ka[vbh]i*
ka 和 i 之间可能存在 v 或 bh。
我写的代码不正确。正确的命令是什么?
【问题讨论】:
一个很好的方法是使用扩展的 glob。有了它们,您可以在 Bash 上执行正则表达式。
首先,您必须启用extglob 功能,因为它默认处于禁用状态:
shopt -s extglob
然后,编写一个具有所需条件的正则表达式:stuff + ka + v 或 bh + i + stuff。一起来:
ls -l *ka@(v|bh)i*
语法和普通的正则表达式有点不一样,所以你需要读入Extended Globs那个...
@(list):匹配给定模式之一。
$ ls
a.php AABB AAkabhiBB AAkabiBB AAkaviBB s.sh
$ ls *ka@(v|bh)i*
AAkabhiBB AAkaviBB
【讨论】:
稍长的 cmd 行可以使用 find、grep 和 xargs。它的优点是可以轻松扩展到不同的搜索词(通过扩展 grep 语句或使用 find 的附加选项),更具可读性(恕我直言)以及能够对找到的文件执行特定命令的灵活性
find . | grep -e "kabhi" -e "kavi" | xargs ls -l
【讨论】:
你可以在 bash 中使用curly braces 得到你想要的:
ls -l *ka{v,bh}i*
注意:这不是一个正则表达式问题,而是一个“shell globbing”问题。 Shell “glob 模式”与正则表达式不同,尽管它们在很多方面都相似。
【讨论】: