文字列に空白文字があるかどうかを確認するには? Unicode 幅が 0 の文字など、ASCII 以外の項目について心配する必要はありません。文字列がシェル変数(たとえば)に格納されていると想定できます$string
。
動作例:
abc
空白があるのでtrueを返します。
\tabc
タブがあるのでtrueを返します。
abc
空白文字がないため、falseを返す必要があります。
abc
hello
改行文字があるのでtrueを返す必要があります。
一般的なコマンドラインユーティリティ(sed
、、、、)を使用するソリューションで十分ですgrep
。awk
bash
ベストアンサー1
POSIX sh構文から:
case $string in
(*[[:blank:]]*) echo "string contains at least one character classified as blank";;
(*[[:space:]]*) echo "string contains at least one character classified as whitespace (but not blank)";;
(*) echo no character classified as whitespace;;
esac
[:blank:]
のサブセットでなければなりません[:space:]
。[:blank:]
少なくともスペースとTABと、少なくともスペース、[:space:]
TAB、NL、CR、FF、およびVTを含めることが保証されます。
これは、使用されるエンコードとロケールの文字分類に基づいています。ほとんどのシステムでは、すべてのロケールはASCII文字セットまたはASCII親セットを使用します(一部の日本語ロケールの一部のBSDにあるMS-Kanjiを無視すると、0x5cが代わりに使用されます¥
(文字\
がありません\
!)。残りはASCII親セットです。 )。
$string
EBCDICベースのシステムでも、1つ以上のASCIIエンコーディングを含むASCIIスペースを確認するには、バイト値セットを指定するか、iconv
テーマを現在の文字セットからASCIIに変換する必要があります。
ascii_whitespace=$(printf ' \r\n\r\f\v' | iconv -t ASCII)
# or
ascii_whitespace=$(printf '\40\11\12\13\14\15')
case $string in
(["$ascii_whitespace"]) echo contains at least one ASCII whitespace;;
esac
(\15
このシステムでは改行文字が発生しないことを願っています。)