回答:
それは確かに、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()[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>
ポータブル文字セット、およびクラス空白に含まれるいずれかの文字が自動的にこのクラスに含まれています。
less +"$cmd"
ので、ありがとう。
[]
が内側から独立していることを拾わないことで許されるかもしれません[]
。私は(!)質問から答えへの道を見つけようとしましたが、幸運な推測が必要でしたが、答えが何であるかをあまり知りませんでした:)
これは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
[[:ascii:]]
、および[[:word:]]
POSIXクラスではありません(これらはbash
-specificのようです)、私も見つけること[[:<:]]
もできません[[:>:]]
。より良いリファレンスはpubs.opengroup.org/onlinepubs/9699919799/basedefs/…
[[:ascii:]]
および[[:word:]]
は標準のPOSIXクラスではありません。とのため[[:<:]]
に[[:>:]]
、参照を見つけることができませんが、それは同じです\b
。en.wikipedia.org/wiki/Regular_expression#Character_classes
[[:<:]]
:そのクレームこれはと互換性の拡張、であるが、POSIX 1003.2で指定されていない
[[:<:]]
:PostgreSQLは持っているのと同じ注意点と、あまりにもFreeBSDのであるfreebsd.org/cgi/...
[[:ascii:]]
し、[[:word:]]
パターンマッチングではbashでコースワークのが、正規表現で(少なくとも私のシステム上で、私はbashは、システムの正規表現ライブラリを使用して考えて)ではありません。ああ。
正規表現およびファイル名のグロブ/シェルパターンでは、[...]
構造は括弧内にリストされている文字の任意の1文字と一致します。これらの括弧内では、いくつかの名前付き標準文字クラスを使用できます。それらの1つは[:space:]
、空白文字に一致します(\s
Perl正規表現のように)。たとえば、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
で使用されsed
、Linuxのmanページなどで説明されていますregex(7)
LESS=+'/Within \[ and \],' man bash
32のn
extコマンドではなく、手動で一致するものを見つけやすくなりました:-)。