
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 マニュアル:
空のパターンがすべての入力ラインと一致するのはなぜですか?
"grep"コマンドは、パターンに一致する文字列を含む行を検索します。各行には空の文字列が含まれているため、空のパターンのために「grep」が各行で一致するものを探します。
grep $'a\nb'
等しい
grep 'a
b' infile
またはgrep -e 'a' -e 'b' infile
。入力内容に一致する項目がないため、何も印刷されません。
頼む
すべての行に一致するのに
''
なぜ何も印刷しないのですか-o
?
これGNUのマニュアルページ言った(強調):
-o
、--only-matching
印刷一致のみ(空ではありません)線の一部を一致させる...
今はOSXにアクセスできませんが、そのマニュアルページにこの内容が記載されていると確信しています。GNU Grep マニュアル。一致する線の一致部分から空いた、何も印刷されません。