8

私は bash で拡張グロビングをいじりましたが、逆マッチャーには奇妙な点があり!(PATTERN)ます。次の例を考えてみましょう

$ touch ab ba
$ shopt -s extglob

$ echo *a*
ab ba
$ echo !(a)*a*
ab ba
$ echo *a*!(a)
ab

空の文字列に一致するように見えます!()が、なぜ*a*!(a)一致しないのbaですか?

ab2番目の例では次のように一致すると想定しました

!(a) ->  ""
*    ->  ""
a    ->  "a"
*    ->  "b"

baこれは、次のように 3 番目のケースでの一致を示唆します。

*    ->  "b"
a    ->  "a"
*    ->  ""
!(a) ->  ""

しかし、これはうまくいかないようです。

貪欲さを考えても、それは私には意味がありません。私は何が欠けていますか?

編集:
私はオンですGNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

4

3 に答える 3

1

これは確かに奇妙です。あなたの行動を再現できました。奇妙さはキャラクターの*背後にありaます。あなたのコードを実行すると:

$ echo *a*!(a)
ab

・・・ご指摘の通りです。しかし、その秒をスキップすると、*両方のファイルに一致します

$ echo *a!(a)
ab ba

つまり、一致する要素は正しいはずです。問題は、なぜこの 2 番目のアスタリスクが最初の例のヌル文字列と一致しないのかということです。ドキュメントによると、null 文字列と一致するはずですが、これが正しく機能していないようです。

bash のバージョンがドキュメントと一致しないのではないでしょうか?

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
于 2012-09-26T07:50:22.023 に答える
1

これは機能します: () 明確にするために追加されました

echo @(*a*)!(a)
echo !(a)@(*a*)

奇妙な : 、 and*a*!(a)cに一致(これは通常の動作です)abcbac

于 2012-09-26T10:22:39.010 に答える
0

Bashのバグです

Chet Ramey は
[...] を書いており、それは次のバージョンで修正される予定です。

于 2012-09-29T09:23:37.467 に答える