私はUbuntu 8.04を実行していますが、コードは次のようになります...
for (i=1;i<=n;i++)
{
if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
}
--posix スイッチがないと、{n} 式が gawk で機能しないことがすぐにわかりました。有効にすると式は機能しますが、大文字と小文字を区別せずに AAAA と aaaa に一致します。ここで何が起こっているのですか?
私はUbuntu 8.04を実行していますが、コードは次のようになります...
for (i=1;i<=n;i++)
{
if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
}
--posix スイッチがないと、{n} 式が gawk で機能しないことがすぐにわかりました。有効にすると式は機能しますが、大文字と小文字を区別せずに AAAA と aaaa に一致します。ここで何が起こっているのですか?
式自体は私のために機能します:
dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}'
AAAA
Yes
AA
Yes
TT
Yes
tt
YY
Yes
yy
あなたの問題は2つの原因によって引き起こされる可能性があります。誤ってIGNORECASE
awk変数を設定したか、大文字と小文字を区別しない操作をオフにしたか(BTWIGNORECASE
はでは機能しません--posix
が--re-interval
、正規表現でも中括弧を有効にする、で機能します)、またはロケールの照合シーケンスの古典的な問題です(gawkはロケール対応の大文字と小文字の比較)。これは、小文字がいくつかの大文字と比較されることを意味します。マニュアルの関連部分からの引用:
多くのロケールは文字を辞書順にソートします。これらのロケールでは、「[a-dx-z]」は通常「[abcdxyz]」と同等ではありません。代わりに、たとえば'[aBbCcDdxXyYz]'と同等である可能性があります。角かっこ式の従来の解釈を取得するには、LC_ALL環境変数を値「C」に設定してCロケールを使用できます。
それ以外の場合、GNU awkを使用している場合は、 [:upper:]アルファベット文字クラスを使用できます。
% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO
私はmawkしかインストールしていませんが、これはあなたが探しているものでしょうか?
for (i=1;i<=n;i++) { if (arr[i] ~ [^AZ]{2,4}$/) printf(arr[i]) }