Grep 在 C 风格引用字符串中使用 `\n` 打印文件中的每一行

Grep 在 C 风格引用字符串中使用 `\n` 打印文件中的每一行

当我遇到这个奇怪的事情时,我试图解决使用 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 手册:

  1. 为什么空模式匹配每个输入行?

    “grep”命令搜索包含与模式匹配的字符串的行。每行都包含空字符串,因此空模式会导致“grep”在每行上找到匹配项。


grep $'a\nb'相当于

grep 'a
b' infile

或者grep -e 'a' -e 'b' infile。由于您的输入中没有匹配项,因此不会打印任何内容。


你问

既然''匹配每一行那么为什么不-o打印任何东西呢?

GNU 手册页说(强调我的):

-o,--only-matching

    只打印匹配的(非空)匹配线的一部分...

我现在无法访问 OSX,但我很确定他们的手册页也提到了这一点……它也在GNU Grep 手册。由于匹配线的匹配部分是空的,没有打印任何内容。

相关内容