1

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

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

我只会 as blue回来

我试过echo ^an*了,但这也返回了 1 个字符的目录。

有什么办法我可以做到这一点的形式echo globalpattern

4

3 回答 3

2

您可以在 bash 中使用 shell 扩展通配符功能:

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

!()构造反转其内部表达式,请参阅this了解更多信息。

在 zsh 中:

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

在这种情况下,~否定波浪号之前的模式。有关更多信息,请参阅手册

于 2012-09-15T20:35:27.863 回答
1

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

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

grep在现代 shell的命令中,引号并不是绝对必要的。大约25 年以前,Bourne shell^是 的同义词,|所以我仍然在插入符号周围使用引号。

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


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

关于什么:

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

a第一项列出了所有不以;开头的两个加字符名称。a第二个列出了第一个是第二个不是的所有双加字符名称n

于 2012-09-15T21:15:14.533 回答
0

这应该可以,但你可能会更好 ls 甚至找到:

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

Shell globbing 是正则表达式的一种形式,但它不如 egrep 正则表达式强大。

于 2012-09-15T18:53:29.573 回答