1

echo を使用して、少なくとも 2 文字で始まるが「an」で始まらないディレクトリ (コンテンツではない) を表示したい

たとえば、ディレクトリに次のものがあったとします。 a as an23 an23 blue

私はただ as blue戻ってくるだろう

試してみecho ^an*ましたが、ディレクトリも1文字で返されます。

次の形式でこれを行う方法はありますかecho globalpattern

4

3 に答える 3

2

シェルの拡張グロブ機能をbashで使用できます。

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

!()コンストラクトはその内部式を反転します。詳細については、これを参照しください。

zshの場合:

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

この場合、~チルダの前のパターンを無効にします。詳細については、マニュアルを参照してください。

于 2012-09-15T20:35:27.863 に答える
1

名前には少なくとも2つの文字が必要なので、printf '%s\n' ??*このような名前を別々の行にエコーするために使用できます。次に、で始まる名前を削除して、次のようにすることができanますgrep -v '^an'

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

grep最新のシェルを使用するコマンドでは、引用符は厳密には必要ありません。四半世紀ほど前に、ボーンシェルは^その同義語として使用されていた|ので、私は今でもキャレットの周りに引用符を使用しています。

echoの代わりにどうしても使用する必要がある場合はprintf、空白を改行にマップする必要があります(空白を含む名前がない場合)。


私はechoコマンドだけで試していますが、grepもありませんか?

どうですか:

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

最初の用語は、a;で始まらない2つ以上の文字名をすべてリストします。2番目のリストには、2つ以上の文字名がすべてリストされています。最初の名前はaで、2番目の名前はそうではありませんn

于 2012-09-15T21:15:14.533 に答える
0

これでうまくいくはずですが、 ls または find を使用したほうがよいでしょう:

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

シェルのグロビングは正規表現の一種ですが、egrep 正規表現ほど強力ではありません。

于 2012-09-15T18:53:29.573 に答える