bash正規表現:アスタリスクのメタ文字のため、追加の改行は終了します。

bash正規表現:アスタリスクのメタ文字のため、追加の改行は終了します。

検索操作では、アスタリスクメタ文字の基本機能をテストするために、grep次のファイル()を使用しました。regex.txt

$ cat regex.txt
1
11
111
1111
11111





$

私の例では、意図的に6つの改行が追加されました11111

質問1.

grep "11*" regex.txt次の改行文字を除いての出力がの出力と異なるのはなぜですか?11111grep "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*以下を含む行のみを印刷します。少なくとも2 1、おそらくそれ以上。1111*次を含む行と一致します。少なくとも3 1、おそらくそれ以上。

ここで重要なのは、*パターン全体ではなく、直前の文字だけが影響を受けるということです。パターン全体に数量子を提供するには、括弧を使用できます。

$ grep '\(111\)*' regex.txt 
1
11
111
1111
11111





$    

\ここで、角括弧(検索パターンに含まれないようにエスケープする必要があります)は、文字をグループ化して*グループに適用されます。上記のように、ゼロ個以上の項目を含む行と一致するため、111すべての行を印刷します。

おすすめ記事