検索操作では、アスタリスクメタ文字の基本機能をテストするために、grep
次のファイル()を使用しました。regex.txt
$ cat regex.txt
1
11
111
1111
11111
$
私の例では、意図的に6つの改行が追加されました11111
。
質問1.
grep "11*" regex.txt
次の改行文字を除いての出力がの出力と異なるのはなぜですか?11111
grep "1*" regex.txt
質問2.
の出力はgrep "111*" regex.txt
次のとおりです。
11
111
1111
11111
の出力はgrep "1111*" regex.txt
次のとおりです。
111
1111
11111
の出力はgrep "11111*" regex.txt
次のとおりです。
1111
11111
検索キーで「1」を増やすたびに最上位レイヤーが消えるのはなぜですか?
答え1
2つの質問は基本的に同じです。正規表現では、*
「前の文字と0回以上一致」を意味します。したがって、1*
0以上と一致します1
が、11*
1
すでにフォロー中0以上1
。これは意味する
grep "11*"
以下を含む行のみを印刷します。少なくとも一つ1
。*
2番目の項目にのみ適用されるため、1番目の1
項目は必須です。そのため、空行が見えず、一致しません1
。grep "1*"
0以上と一致します1
。これには一致する先行文字がないため、空白行には0が含まれているため一致します1
。grep "111*"
grep "1111*"
矛盾の理由は上記の最初の項目と同じです。111*
以下を含む行のみを印刷します。少なくとも21
、おそらくそれ以上。1111*
次を含む行と一致します。少なくとも31
、おそらくそれ以上。
ここで重要なのは、*
パターン全体ではなく、直前の文字だけが影響を受けるということです。パターン全体に数量子を提供するには、括弧を使用できます。
$ grep '\(111\)*' regex.txt
1
11
111
1111
11111
$
\
ここで、角括弧(検索パターンに含まれないようにエスケープする必要があります)は、文字をグループ化して*
グループに適用されます。上記のように、ゼロ個以上の項目を含む行と一致するため、111
すべての行を印刷します。
答え2
'1*'
0個以上の1文字を選択してください。1
値が1の文字を選択します。空行には1文字が含まれていませんが、する一つの文字はありません。