我想使用echo来显示(不是内容)以至少2个字符开头但不能以“an”开头的目录
例如,如果在目录中有以下内容:
a as an23 an23 blue
我只会得到
as blue
返回
我尝试了echo ^an*
但是它也返回了包含1个字符的目录。
我有什么方法可以echo globalpattern
答案 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那么强大。