先行スペースと一致する Bash 正規表現

先行スペースと一致する Bash 正規表現

テキストファイルの1行を次のように組み合わせようとしています。

if [[ ${regel} =~ ([\s][CN][G]{2}[A]{2}[T]) ]];

また、/sの代わりに/Aと/bを試してみました。試してみたいくつかの例は次のとおりです。

if [[ ${regel} =~ (\A[CN][G]{2}[A]{2}[T]) ]];
if [[ ${regel} =~ (\b[CN][G]{2}[A]{2}[T]) ]];
if [[ ${regel} =~ ([\A][CN][G]{2}[A]{2}[T]) ]];
if [[ ${regel} =~ ([\b][CN][G]{2}[A]{2}[T]) ]];

一致するものがないように最初の項目を削除すると、

if [[ ${regel} =~ ([CN][G]{2}[A]{2}[T]) ]];

それは私が一致させたいものと一致しますが、文字列を中央に合わせる必要がないように、前のスペースと一致させたいと思います。

私が望む試合の例:

OZBMN6HH1KI CGGAATGGGGGGGGGGGGGGGCGAGAATCTGAAATAGAGTGGTGACGTGCTGCGTTGACATAGGTCCTAGGGACCACCAG

私は何が間違っていましたか?どのように一致させることができますか␣CGGAAT

ベストアンサー1

bashの正規表現は[[ =~ regex ]]POSIX拡張正規表現です。拡張正規表現がPOSIXで指定された範囲を超えて拡張されるシステム(たとえば、\s括弧式内にはありませんが、サポートされているGNU正規表現\b)では、これをbashで引用符で囲まれていない拡張部分としてのみ使用できます(有効にしない限り)。 bash-3.1互換性):

[[ a =~ \ba ]]                    # returns false
[[ a =~ $(printf %s '\ba') ]]     # returns true on GNU systems
BASH_COMPAT=3.1; [[ a =~ '\ba' ]] # returns true on GNU systems
re='\ba'; [[ a =~ $re ]]          # returns true on GNU systems.

\A意味するならトピックの開始そして、私たちは他の正規表現であるperlまたはperl互換正規表現について話しています。

標準EREには複数行パターンの概念がなく、^タイトルの先頭から一致することができますが、perlsを使用するときなど、各行の後ろにも一致できます(?m)。一部のERE実装(ast-openのERE実装など)はこれを拡張としてサポートしていますが(ksh93で動作します)、とにかく複数行モードはデフォルトモードではないため、使用する方が良いでしょ[[ a =~ \Aa ]]う。^\A

あっても合わないperl[\A]トピックの開始[...]文字(または時には組み合わせ要素)と一致するように設計されています。 EREまたはPerl RE[\A]で一致します。AEREまたはPerl REのバックスペース文字と一致します。 EREまたはPerl REの(空白文字)と同じです。\A[\b]b\[\s]s\\s

標準 ERE を使用して[CN]G{2}A{2}Tトピックの先頭 ( \A) または単語以外の文字 ( ) の後の a を一致させるには、次のようにします。\b

[[ $var =~ (^|[^[:alnum:]_])[CN]G{2}A{2}T ]]

おすすめ記事