0

私はUbuntu 8.04を実行していますが、コードは次のようになります...

 for (i=1;i<=n;i++)
 {
  if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
 }

--posix スイッチがないと、{n} 式が gawk で機能しないことがすぐにわかりました。有効にすると式は機能しますが、大文字と小文字を区別せずに AAAA と aaaa に一致します。ここで何が起こっているのですか?

4

3 に答える 3

5

式自体は私のために機能します:

dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}'
AAAA
Yes
AA
Yes
TT
Yes
tt
YY
Yes
yy

あなたの問題は2つの原因によって引き起こされる可能性があります。誤ってIGNORECASEawk変数を設定したか、大文字と小文字を区別しない操作をオフにしたか(BTWIGNORECASEはでは機能しません--posix--re-interval、正規表現でも中括弧を有効にする、で機能します)、またはロケールの照合シーケンスの古典的な問題です(gawkはロケール対応の大文字と小文字の比較)。これは、小文字がいくつかの大文字と比較されることを意味します。マニュアルの関連部分からの引用:

多くのロケールは文字を辞書順にソートします。これらのロケールでは、「[a-dx-z]」は通常「[abcdxyz]」と同等ではありません。代わりに、たとえば'[aBbCcDdxXyYz]'と同等である可能性があります。角かっこ式の従来の解釈を取得するには、LC_ALL環境変数を値「C」に設定してCロケールを使用できます。

于 2009-02-20T10:38:06.077 に答える
0

それ以外の場合、GNU awkを使用している場合は、 [:upper:]アルファベット文字クラスを使用できます。

% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO
于 2009-03-19T19:36:45.663 に答える
0

私はmawkしかインストールしていませんが、これはあなたが探しているものでしょうか?

for (i=1;i<=n;i++) { if (arr[i] ~ [^AZ]{2,4}$/) printf(arr[i]) }

于 2009-02-20T07:57:45.053 に答える