Bashでは、一致する日本語正規表現(単純範囲)が期待どおりに機能しません。

Bashでは、一致する日本語正規表現(単純範囲)が期待どおりに機能しません。

私の正規表現は大丈夫だと確信していますが、bashでは機能しません。私はそれを使って自分で作りました。https://unicode.org/charts/。ご覧のとおり、awkではうまく動作します。

以下は一部の範囲なので、直接確認する必要はありません。特に日本語がわからない場合にはさらにそうです。

  • ひらがな [ぁ-ゟ]

    • まったく同じですね。
  • カタカナ【゠-ヿㇰ-ㇿ! -○]

    • ゠아아이웨에오카가키기크그게게고사자시지즈洗剤ソゾタゾタソチベッツヅTetrapodケネンボボボボプフヘベベ・-ヽヾヿ
    • ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
    • ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRTUVWX YZ[\]^_`abcdefghhiiklスンノプクルスチュウ オキシ{|}~}~ }~ LMNO |ᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ¢£¬ ̄ ¦ \\¥│←↑→↓ð○

また、漢字を見つける正規表現もありますが、[一-龥]この正規表現はbashで期待どおりに機能します。問題を正確に特定するために追加したコメントです
>>> wrong!

[[ "する" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is hiragana

echo 'する' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'
is hiragana

[[ "スル" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is hiragana >>> wrong!

echo 'スル' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'

[[ "僕" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is not hiragana

echo '僕' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'

[[ "する" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is katakana >>> wrong!

echo 'する' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'

[[ "スル" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is katakana

echo 'スル' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'
is katakana

[[ "僕" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is not katakana

echo '僕' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'

bashがひらがなとカタカナを同じだと思うようにあらかじめ変換しているような気がしますか?

答え1

必要なスクリプトがあります。

string1="する"
string2="スル"

if echo "$string1" | grep -P '[ぁ-ゟ]' >/dev/null; then
    echo 'is hiragana'
else
    echo 'is not hiragana'
fi

if echo "$string2" | grep -P '[ぁ-ゟ]' >/dev/null; then
    echo 'is hiragana'
else
    echo 'is not hiragana'
fi

if echo "$string1" | grep -P '[゠-ヿㇰ-ㇿ!-○]' >/dev/null; then
    echo 'is katakana'
else
    echo 'is not katakana'
fi

if echo "$string2" | grep -P '[゠-ヿㇰ-ㇿ!-○]' >/dev/null; then
    echo 'is katakana'
else
    echo 'is not katakana'
fi

関連情報