GrepはCスタイルの引用符文字列で `\ n `を使用してファイルの各行を印刷します。

GrepはCスタイルの引用符文字列で `\ n `を使用してファイルの各行を印刷します。

grep検索を使用して問題を解決しようとしたときに奇妙なことがわかりました。

私はfile1.txtに次の2行があるとします。

hello
to you

私は毎回

grep $'a\n' file1.txt

# Output
hello
to you

grep -o $'a\n' file1.txt

# Output
# Nothing

grep $'a\nb' file1.txt

# Output
# Nothing

$はファイルにはありませんが、ファイル全体を印刷する改行文字が続くことをa\n意味しますか?aなぜですか?

PS --zオプションを使用しても動作は同じです。

答え1

grep改行で区切られた一連の「パターン」(たとえば、1つ以上)を許可するため、次のgrep $'a\n' infileようになります。

grep 'a
' infile

または、grep -e 'a' -e '' infileパターンa(この場合は一致するものはありません)を提供し、空のパターンを提供します。'' すべての行に一致。記事にも言及されています。GNU Grep マニュアル:

  1. 空のパターンがすべての入力ラインと一致するのはなぜですか?

    "grep"コマンドは、パターンに一致する文字列を含む行を検索します。各行には空の文字列が含まれているため、空のパターンのために「grep」が各行で一致するものを探します。


grep $'a\nb'等しい

grep 'a
b' infile

またはgrep -e 'a' -e 'b' infile。入力内容に一致する項目がないため、何も印刷されません。


頼む

すべての行に一致するのに''なぜ何も印刷しないのですか-o

これGNUのマニュアルページ言った(強調):

-o--only-matching

    印刷一致のみ(空ではありません)線の一部を一致させる...

今はOSXにアクセスできませんが、そのマニュアルページにこの内容が記載されていると確信しています。GNU Grep マニュアル。一致する線の一致部分から空いた、何も印刷されません。

関連情報