先行スペースと一致する 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 ]]

答え2

\A\bそして、\sそれぞれPerlの「文字列の開始」、「単語の境界」、および「空白文字」です。 (よりperlreマニュアルページ) Bash で使用される拡張正規表現ではサポートされません。

EREでは、文字列の先頭は^空白文字と一致するようにマークされて[[:space:]]います。一部のシステム(少なくともGNU)では、左の単語の境界を\<、右の単語の境界をとして表示できます\>。それ以外の場合は、<リテラルと と一致することがあります>

しかし、空白とバックスラッシュを使用すると、Bashが条件で正規表現を解析する方法に問題が発生します。引用符のない文字通りのスペースはREを終了し、バックスラッシュはまだエスケープ文字です。この問題を解決するには、まず正規表現を変数に保存します。

re=' [CN]GGAAT'
if [[ $regel =~ $re ]]; then echo y; fi

または\<動作し、使用したい場合:

re='\<[CN]GGAAT'
if [[ $regel =~ $re ]]; then echo y; fi

答え3

[\s]使用。 。 。交換[[:space:]]。その由来が何なのかはよくわかりません[\s]が、他の人同様の誤解がありました。したがって、正しい形式は

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

答え4

スペースを引用符で囲んだスペースと一致させることができます。

if [[ ${regel} =~ ' '[CN]G{2}A{2}T  ]]

[]周囲の単一文字を削除しました。

関連情報