当我遇到这个奇怪的事情时,我试图解决使用 grep 搜索的一些问题。
假设我的 file1.txt 有这两行
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
接受一系列“模式”(即一个或多个),以换行符分隔,因此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 手册。由于匹配线的匹配部分是空的,没有打印任何内容。