“.*”正则表达式在 ubuntu 或 wsl 中无法正常运行

“.*”正则表达式在 ubuntu 或 wsl 中无法正常运行

有一个文件包含以下文本:

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 终端内尝试了同样的事情,它在那里正常运行。

附上两张图片: 在 WSL Ubuntu 中运行 在 Virtual Box 中运行 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 -ccat -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

相关内容