テキストファイルの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には複数行パターンの概念がなく、^
タイトルの先頭から一致することができますが、perl
sを使用するときなど、各行の後ろにも一致できます(?m)
。一部のERE実装(ast-openのERE実装など)はこれを拡張としてサポートしていますが(ksh93で動作します)、とにかく複数行モードはデフォルトモードではないため、使用する方が良いでしょ[[ a =~ \Aa ]]
う。^
\A
あっても合わないperl
。[\A]
トピックの開始。[...]
文字(または時には組み合わせ要素)と一致するように設計されています。 EREまたはPerl RE[\A]
で一致します。A
EREまたは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 ]]
[]
周囲の単一文字を削除しました。