grep コマンドのパターン (^[0-9]..[a-zA-Z ]+$) と一致できる式は何ですか? Linux バッシュ

grep コマンドのパターン (^[0-9]..[a-zA-Z ]+$) と一致できる式は何ですか? Linux バッシュ

(^[0-9]..[a-zA-Z ]+$)コマンド(Linux端末)で検出された正規表現を理解しようとしています。grep

次のコマンドを書くとわかります。

grep ^[0-9]..[a-zA-Z] filename.txt

次の式を含む行を検出しますが、それが何を意味するのか、そしてコマンドを使用してどのような式を検出できるのか92afg わかりません。+$

grep ^[0-9]..[a-zA-Z]+$ filename.txt

新しいテキストファイルを開き、検出されると思われる式だけを入力してみましたが、一致する式が1つもなかったので、これについての説明を聞きたいと思います。

ベストアンサー1

それを分析しましょう。まず、このRegExpは「拡張正規表現」構文(ERE) - デフォルト+で使用される「基本正規表現」構文に影響を与えないメタ文字ですgrep(つまり、それ自体が一致し、その位置にリテラルが必要であることを意味します+)。その正規表現を使用するには、grep次のものが必要です。このオプションを渡します-E

  • ^正規表現のこの位置を行の先頭に接続するアンカーです。
  • [0-9]は、および間のソート範囲に属する単一の(1)文字に一致する文字のリストです。含まれる内容は、環境変数によって決定される「ソート順」によって異なります。09LC_COLLATE
  • .単一文字と一致するため、2 は..「任意の 2 文字」を意味します。
  • 戻り値は、(1)との間の文字、および(1)との間の文字[a-zA-Z]と一致する文字のリストです。繰り返しますが、これが意味するものはソート順によって異なります!azAZ
  • +「以前の一つ以上」を意味する
  • $正規表現のこの位置を行の終わりに結び付ける基準点です。

だから、あなたの正規表現~を目指して(1)以下の条件を満たす行と一致

  • 任意の数字で始まる
  • その後にランダムな2文字が続きます。
  • 行末までの文字のみを含めます(少なくとも1つ以上)。

(1)実際にできることについては、以下を参照してください。

いくつかのメモ

  1. あなたの例では、引用符なしで正規表現を使用します。これは、コマンドに渡される前にすべての文字がシェルによって解釈されることを意味しますgrep。パターンに$ワイルドカード文字(*および文字リスト?[...])が含まれている場合、シェルは変数拡張を実行するか(したがって正規表現の一部を置き換える)、ワイルドカードパターンを複数のファイル名に拡張して、最終ファイル名にパラメータを追加します。 。もともと望んでいたよりもコマンドラインが多くなりました。シェルに固有の他の文字(>#など;)は、予期しない動作をさらに引き起こす可能性があります。使用する必要があります

    grep -E '^[0-9]..[a-zA-Z]+$' filename.txt
    

    代わりに。-xこのフラグを使用して「フルライン」マッチを強制すると、開始アンカーとエンドアンカーを削除できます。

    grep -x -E '[0-9]..[a-zA-Z]+' filename.txt
    
  2. 範囲(例a-z:)を含む文字のリストは次のとおりです。危険なぜなら彼らはあなたにアイデアを与えないかもしれないからです。素朴な人はASCIIテーブルの開始文字と終了文字の間のすべての文字と一致すると予想するかもしれませんが、これはlocalesにのみ適用されますC。他のロケール(特に一般的に設定されているシステムロケール(たとえば))では、この組み合わせはほとんどen_US.UTF-8の大文字と一致します。さらに、一致は実際には個々の文字レベルではなく「組み合わせ要素」レベルで行われます。つまり、一部のロケールではaAbB ... zZa-z文字の組み合わせ可能な一致(例:dzsハンガリー語)!バラよりこの回答(または一般的にパターンマッチングに対する@Stéphane Chazelasの答えのほとんど)、より多くの洞察を得ることができます。範囲が有効であることを確認するには、指定されたコマンドの照合順序を最小限に設定します。

    LC_COLLATE="C" grep -E ' ... ' filename.txt
    

おすすめ記事