文字列にASCIIスペース文字が含まれているかどうかをテストする方法は?

文字列にASCIIスペース文字が含まれているかどうかをテストする方法は?

文字列に空白文字があるかどうかを確認するには? Unicode 幅が 0 の文字など、ASCII 以外の項目について心配する必要はありません。文字列がシェル変数(たとえば)に格納されていると想定できます$string

動作例:

abc 空白があるのでtrueを返します。

\tabcタブがあるのでtrueを返します。

abc空白文字がないため、falseを返す必要があります。

abc
hello

改行文字があるのでtrueを返す必要があります。


一般的なコマンドラインユーティリティ(sed、、、、)を使用するソリューションで十分ですgrepawkbash

ベストアンサー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親セットです。 )。

$stringEBCDICベースのシステムでも、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このシステムでは改行文字が発生しないことを願っています。)

おすすめ記事