"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桁の数字の場合は、正規表現に次のように通知する必要があります。みんなエンドアンカーポイントが必要な行全体を見たいです。
答え2
2回目のイベントを公開
sed -n '/^[0-9]\{1,3\}$/p' file
^
文字列の先頭と一致します。[0-9]\{1,3\}
小数点以下1~3桁許容$
文字列の終わりと一致します。つまり、もはや何も記録したくありません。
$
2番目のケースは最初のケースとは異なります。