sed で正規表現 {m,n} の出力をデコードする際に問題が発生しました。

sed で正規表現 {m,n} の出力をデコードする際に問題が発生しました。

"numbers.txt"ファイルを作成しました。

1
12
123
1234
12345
123456

私は「前の文字が最小m回、最大n回表示されます」という意味の{m,n}形式の正規表現を練習しています。

今私が使うとき

sed -n '/^[0-9]\{1,3\}/ p' numbers.txt

Numbers.txt ファイルのすべての行を表示します。

しかし、私が使うとき

sed -n '/^[0-9]\{1,3\}$/ p' numbers.txt

このコマンドは、1文字以上3文字以下の文字のみを表示します。

なぜこの「$」を追加するのですか?私の理解によると、$を入力すると、少なくとも1文字から最大3文字で終わる行を見つけることができます。

また、最初のコマンドがすべての行を印刷するのはなぜですか?

ベストアンサー1

この正規表現は次のとおりです。

^[0-9]\{1,3\}

sedに以下を検索するように指示します。

  • ^- 行の先頭、その後
  • [0-9]- 単一数字\{1,3\}- 1〜3回繰り返してから
  • 何でも何でも

...ご覧のように、これはサンプル入力のすべての行と一致します。 1桁、2桁、または3桁の数字で始まるので、最初の3行に一致します。すべて3桁の数字で始まるので、後続の行と一致します(続きますが、正規表現は関係ありません)。

正規表現は「貪欲」です。つまり、基本的には可能な限り一致しますが、完全な正規表現でコーディングするすべての柔軟性を考慮すると、「怠惰」という意味です。あなたは特に^それを両端に固定します$

あなたの意図は、sedに次の内容の行だけを印刷するように指示するものと仮定します。正確に1~3桁の数字の場合は、正規表現に次のように通知する必要があります。みんなエンドアンカーポイントが必要な行全体を見たいです。

おすすめ記事