web-dev-qa-db-ja.com

bashでの[[:space:]]の意味は何ですか?

私はbashスクリプトに出くわしました。 bashスクリプトで[[:space:]]はどういう意味ですか?なぜ二重コロンなのか?

25
geraldin

これは確かにbashのマニュアルにありますが、探しているものを知るのに役立ちます。探しているものがわからない場合は、役に立たないで。 [[を検索すると、[[ expression ]]条件式セクションに気を取られてしまいます。さらに、:space:を検索すると、同じセクションに2つの例が表示されます。その例では、パンくずリストに従うことができます。

たとえば、ゼロを含む任意の数、スペース文字、0または1つの「a」のインスタンスで構成される値に文字のシーケンスがある場合、次の行は(シェル変数lineに格納されている)行と一致します。 「b」:

[[ $line =~ [[:space:]]*?(a)b ]]

... [[:space:]]部分が「スペース文字」に対応していることをつなぎ合わせることができますが、それがonlyリテラルスペースであると考えることは許されますキャラクターであり、キャラクターのクラス全体ではありません。

(オンラインbashマニュアル で文字列" space"(つまり、スペースの後にWordの「スペース」が続く)を検索した場合、32の「のみ」があります。通過するマッチ。 10番目のものがここにあります:

‘[’と ‘]’内では、構文[:class:]を使用して文字クラスを指定できます。ここで、classはPOSIX標準で定義されている次のクラスのいずれかです。

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   Word    xdigit

文字クラスは、そのクラスに属するすべての文字と一致します。

これで POSIX標準 に移動し、「文字クラス」という用語を検索して見つけることができます。

wctype、wctype_l-文字クラスを定義する 、これは次のようにあなたを取得します:

Wctype()[CX] [オプション開始]およびwctype_l()[オプション終了]関数は、現在のロケールの文字タイプ情報によって定義されたコード化文字セットの規則に従って、wctype_tの値を決定します[CX] [オプション開始]または、locale、[Option End]でそれぞれ表されるロケール(カテゴリLC_CTYPE)。

次に setlocale リンクをたどると、最終的に Localeセクション で実際の答えが得られます。

スペース

空白文字として分類される文字を定義します。 POSIXロケールでは、正確に<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>が含まれます。

ロケール定義ファイルでは、upper、lower、alpha、digit、graph、xdigitの各キーワードに文字を指定しないでください。ポータブル文字セットの<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>、およびクラスの空白に含まれているすべての文字は、このクラスに自動的に含まれます。

35
Jeff Schaller

これはBashだけでなく、POSIX表記の一部です。

POSIXとは何ですか?

POSIXまたは「Unix用のポータブルオペレーティングシステムインターフェイス」は、(UNIX)オペレーティングシステムがサポートする必要がある機能の一部を定義する標準の集まりです。これらの標準の1つは、2つの種類の正規表現を定義しています。

POSIXブラケット式

POSIXブラケット式は特殊な種類の文字クラスです。 POSIXブラケット式は、通常の文字クラスと同様に、一連の文字のうち1文字と一致します。

標準POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

なし標準

[[:ascii:]]   ASCII characters
[[:Word:]]    Word characters (letters, numbers and underscores)

レガシー構文(誰かがこれらへの参照を見つけることができますか?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

あなたはここでより多くの情報を見つけることができます: wiki

17
Nima

正規表現およびファイル名グロブ/シェルパターンでは、_[...]_構成は、角かっこ内にリストされている文字のいずれか1文字と一致します。これらの括弧内では、いくつかの名前付き標準文字文字クラスを使用できます。それらの1つは_[:space:]_で、これは空白文字に一致します(Perl正規表現の_\s_など)。たとえば、 Bashのマニュアルのパターンマッチング

したがって、_[[:space:]]_は、正規表現またはパターン一致の一部であり、空白のみに一致します。

例えば。パターンマッチ(Bash固有ではなく標準シェル):

_case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac
_

または正規表現(Bash):

_if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi
_

ブラケット式_[...]_は正規表現とシェルパターンで同じように機能しますが、一般的には非常に同じではないことに注意してください。 (caseおよび_[[ string == pattern ]]_はパターン一致を使用し、_[[ string =~ regex ]]_は正規表現を使用します。)

正規表現もシェル固有ではなく、たとえば、 awksedも同様で、たとえば、 Linuxマニュアルページregex(7)

9
ilkkachu