我很确定我的正则表达式没问题,但它们不适用于 bash。我自己制作了它们,使用https://unicode.org/charts/。正如您将看到的,它们与 awk 一起正常工作。
以下是一些范围,让您无需亲自检查,特别是如果您不懂日语:
平假名 [ぁ-ゟ]
- ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ>゙>゚__ゝゞゟ
片假名 [゠-ヿㇰ-ㇿ!-○]
- ゠ァァィィゥウェエオカガキギクグケゲコゴサザシジジズセゼソゾタソゾタソチヂッツヅテデトドナニヌネノハバパヒビピブプヘベペホボポマミムメモャヤュユョヨラリルヮワワヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ
- ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghhiijklmnopqrstuvwoxyz{|}~ ⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ¢£¬ ̄¦¥₩│←↑→↓ð○
我还有一个正则表达式来查找汉字[一-龥]
,但这个正则表达式在 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