复杂的外壳通配符

时间:2012-09-15 18:13:36

标签: linux shell command-line echo

我想使用echo来显示(不是内容)以至少2个字符开头但不能以“an”开头的目录

例如,如果在目录中有以下内容: a as an23 an23 blue

我只会得到 as blue返回

我尝试了echo ^an*但是它也返回了包含1个字符的目录。

我有什么方法可以echo globalpattern

的形式做到这一点

3 个答案:

答案 0 :(得分:2)

你可以在bash中使用shell扩展的globbing功能:

bash$ setsh -s extglob
bash$ echo !(@(?|an*))

!()构造反转其内部表达式,有关详细信息,请参阅this

在zsh中:

zsh$ setopt extendedglob
zsh$ print *~(?|an*)

在这种情况下,~会否定波形符之前的模式。有关详情,请参阅manual

答案 1 :(得分:1)

由于您希望名称中至少包含两个字符,因此可以使用printf '%s\n' ??*在单独的行中回显每个此类名称。然后,您可以使用an删除以grep -v '^an'开头的名称,从而导致:

printf '%s\n' ??* | grep -v '^an'

在使用现代shell的grep命令中,引号并不是绝对必要的。大约四分之一个世纪前,Bourne shell有^作为|的同义词,所以我仍然使用引号括号。

如果您绝对必须使用echo而不是printf,那么您必须将空白区域映射到换行符(假设您没有任何包含空格的名称)。


  

我正在尝试使用echo命令,没有grep吗?

怎么样:

echo [!a]?* a[!n]*

第一个术语列出了不以a开头的所有两个以上的字符名称;第二个列出所有两个以上的字符名称,其中第一个是a,第二个不是n

答案 2 :(得分:0)

这应该这样做,但你可能会更好地使用ls甚至找到:

echo * | tr ' ' '\012' | egrep '..' | egrep -v '^an'

Shell globbing是一种正则表达式,但它没有egrep regex那么强大。