1

bash では、配列に存在する有効な属性を一致させようとしています。属性は、先頭に感嘆符 (感嘆符、!) を付けることで「無効」にすることができます。この場合、それらを一致させてはなりません。私はこれを持っています:

[[ ${TESTS[@]} =~ [^\!]match ]]

これは、「一致」という単語が TESTS にあり、前に ! がない場合に true を返します。

一致する単語が配列の最初の位置にある場合を除いて、機能します。問題は、正規表現が「! ではない何かが前に付いている一致」と言っていることです。. 最初の項目の場合、前に何もないため、一致しません。

上記を変更して「前に ! を付けないで一致」と言うにはどうすればよいですか? ?

他の質問への回答を読むことから(?<!!)matchを試しましたが、これは機能しません。

4

1 に答える 1

2

これを使用してください:

([^\!]|^)match

使用例:

$ [[ match =~ (^|[^\!])match ]] && echo matches || echo "doesn't match"
matches
$ [[ xmatch =~ (^|[^\!])match ]] && echo matches || echo "doesn't match"
matches
$ [[ '!match' =~ (^|[^\!])match ]] && echo match || echo "doesn't match"
doesn't match

一般に、ここでアサーションを使用することも正しいですが、bash は POSIX 正規表現を使用し、アサーションについて何も知りません。しかし、grep(GNU grep)、またはperl、またはPCREをサポートするものなら何でもできます:

$ echo match | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
matches
$ echo xmatch | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
matches
$ echo '!match' | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
doesn't match
于 2012-08-01T16:54:41.093 に答える