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


23

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

回答:


35

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

たとえば、ゼロ、スペース文字、ゼロまたは1つの「a」のインスタンスを含む任意の数からなる文字列が値に含まれる場合、次はシェル変数行に格納された行に一致します。 「b」:

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

...そこから[[:space:]]「スペース文字」に対応する部分をつなぎ合わせることができますが、それは文字のクラス全体ではなく、文字通りのスペース文字であると考えることは許されます。

オンラインbashマニュアルで文字列" space"(つまり、スペースの後に「スペース」が続く)を検索した場合(つまり?)、約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] [Option Start]およびwctype_l()[Option End]関数は、現在のロケールの文字タイプ情報で定義されたコード化文字セットの規則に従ってwctype_tの値を決定するものとします[CX] [Option Start]または、ロケールで表されるロケールでは、それぞれ[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>ポータブル文字セット、およびクラス空白に含まれるいずれかの文字が自動的にこのクラスに含まれています。


1
LESS=+'/Within \[ and \],' man bash32のnextコマンドではなく、手動で一致するものを見つけやすくなりました:-)。
アイザック

5
@Isaacポイントは、釣りの仕方を男性に教えることだと思う。とは言うものの、私は知らなかったless +"$cmd"ので、ありがとう。
JoL

3
確かに、OPの観点から答えました。彼らは外側[]が内側から独立していることを拾わないことで許されるかもしれません[]。私は(!)質問から答えへの道を見つけようとしましたが、幸運な推測が必要でしたが、答えが何であるかをあまり知りませんでした:)
ジェフシャラー

17

これは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


1
[[:ascii:]]、および[[:word:]]POSIXクラスではありません(これらはbash-specificのようです)、私も見つけること[[:<:]]もできません[[:>:]]。より良いリファレンスはpubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
ええ、、[[:ascii:]]および[[:word:]]は標準のPOSIXクラスではありません。とのため[[:<:]][[:>:]]、参照を見つけることができませんが、それは同じです\ben.wikipedia.org/wiki/Regular_expression#Character_classes
ニマ


[[:<:]]:PostgreSQLは持っているのと同じ注意点と、あまりにもFreeBSDのであるfreebsd.org/cgi/...
ilkkachu

1
そして、[[:ascii:]]し、[[:word:]]パターンマッチングではbashでコースワークのが、正規表現で(少なくとも私のシステム上で、私はbashは、システムの正規表現ライブラリを使用して考えて)ではありません。ああ。
イルカチュウ

9

正規表現およびファイル名のグロブ/シェルパターンでは、[...]構造は括弧内にリストされている文字の任意の1文字と一致します。これらの括弧内では、いくつかの名前付き標準文字クラスを使用できます。それらの1つは[:space:]、空白文字に一致します(\sPerl正規表現のように)。たとえば、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 ]]使用し、正規表現を使用します。)

正規表現もシェル固有のものではなく、たとえばawkで使用されsedLinuxのmanページなどで説明されていますregex(7)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.