有一个文件包含以下文本:
foo bar baz
bar foo baz
baz foo bar
bar baz foo
foo baz bar
baz bar foo
我需要将第一个foo bar baz
和第五个foo baz bar
作为输出到控制台。
因此我尝试了该命令grep '^foo.*' file
,但输出结果并不如预期。我在虚拟盒中安装的 Ubuntu 终端内尝试了同样的事情,它在那里正常运行。
附上两张图片:
答案1
问题在于您已在 Windows 中编辑该文件,这意味着它现在具有 Windows 样式的行尾。这意味着\r\n
而不是\n
。\r
称为回车符,是移回行首的命令,它会执行此操作并导致覆盖输出。如果您自己添加,您可以轻松重现此行为\r
:
$ printf 'foo bar baz\r\n' | grep '^foo.*'
$ printf 'foo bar baz\n' | grep '^foo.*'
foo bar baz
您还可以看到输出是如果您将它通过类似od -c
或cat -v
将显示非打印字符的东西:
$ printf 'foo bar baz\r\n' | grep '^foo.*' | cat -v
foo bar baz^M
是。因此,解决^M
方案\r
是,如果您想在 Linux 中使用文件,则永远不要在 Windows 中编辑它们,或者使用可以让你选择要使用的行尾样式的适当编辑器(显然,Notepad++ 可以做到这一点)或者使用以下命令在 Linux 端修复文件:
dos2unix file
或者
sed -i 's/\r//' file
有关行尾的更多信息,请参阅https://en.wikipedia.org/wiki/Newline。