pro*_*ony 0 bash grep pipe cat
我正在练习 bash。当我尝试此命令时,出现错误:“grep: where: No such file or directory”。
cat file2.txt | tr " " "\n" | grep –i where | wc -l
Run Code Online (Sandbox Code Playgroud)
Content of file2.txt = 1 2 3 4 where 5 where 7 where
Run Code Online (Sandbox Code Playgroud)
如果您从问题中复制命令并使用 UTF-8 分析它到 Unicode 解释器,则–之前i是破折号 U+2013 而不是连字符减号-(U+002D)。这意味着grep将–i视为要搜索的模式和要搜索where的文件,该文件不存在 - 正如错误消息所述。
$ echo "grep –i where | wc -l" | utf8-unicode -w 3
0x67 = U+0067
0x72 = U+0072
0x65 = U+0065
0x70 = U+0070
0x20 = U+0020
0xE2 0x80 0x93 = U+2013
0x69 = U+0069
0x20 = U+0020
0x77 = U+0077
0x68 = U+0068
0x65 = U+0065
0x72 = U+0072
0x65 = U+0065
0x20 = U+0020
0x7C = U+007C
0x20 = U+0020
0x77 = U+0077
0x63 = U+0063
0x20 = U+0020
0x2D = U+002D
0x6C = U+006C
$
Run Code Online (Sandbox Code Playgroud)
对于代码utf8-unicode是现在我可以SOQ(堆栈溢出问题)库在GitHub上的文件utf8-unicode-1.11.tgz在包的子目录。这是当前版本 -utf8-unicode -V报告utf8-unicode: UTF8-UNICODE Version 1.11 (2017-06-12 06:22:15)并utf8-unicode -h提供帮助。使用-w 3意味着它为每个代码点留出足够的空间为 3 个字节宽,从而导致更多的列输出(默认为-w 1)。
在上面的分析中,我没有更广泛地讨论如何改进脚本。如果你有一个足够现代的 GNU grep,你可以只使用两个命令:
$ grep -iow where file2.txt | wc -l
Run Code Online (Sandbox Code Playgroud)
你不能把它简化为一个命令;使用grep -ciow where file2.txt产量 1,而不是 3(因为只有一个输入行匹配)。
对于非 GNU grep,您可能需要使用:
$ tr ' ' '\n' < file2.txt | grep -ic where
Run Code Online (Sandbox Code Playgroud)