为什么这里的 windows 实现的 grep 命令(从 cmd)会给出尾随反斜杠的错误消息?

为什么这里的 windows 实现的 grep 命令(从 cmd)会给出尾随反斜杠的错误消息?

为什么这里的 windows 实现的 grep 命令以及 cmd 中的 grep 命令会给出尾随反斜杠的错误消息?

C:\Users\User>where grep
c:\cygwin\bin\grep.exe

C:\Users\User>c:\cygwin\bin\grep.exe --version
grep (GNU grep) 3.7
Packaged by Cygwin (3.7-2)
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

C:\Users\User>

我看到并知道这是有效的

C:\>echo a^"b | grep ^"
a"b

C:\>

现在正在看 Linux

user@comp:~# echo ab\"c
ab"c
user@comp:~# echo ab\"c| grep \"
ab"c
user@comp:~# echo ab\"c| grep \"    <-- same command as above but with a space after the quote.
ab"c
user@comp:~#

到目前为止还没有什么奇怪的。

现在看看 Windows

C:\>echo a | grep \^"
grep: Trailing backslash

C:\>echo a | grep \^" <-- same command as above, but with a space after the quote.
a

这有效

C:\>echo a^"b | grep ^"
a"b

C:\>

这给出了关于尾随反斜杠的错误

C:\>echo a^"b| grep \^"
grep: Trailing backslash

C:\>

我不明白为什么我会收到这个错误。

这与那件事有关,也很奇怪,我不明白为什么会发生这种情况

如果我在引号后面添加一个空格,则不会出现错误。

C:\>echo a^"b| grep \^"

C:\>

以上内容正在寻找一个引号,后面跟着一个空格。

所以如果我这么做

C:\>echo a^"b | grep \^"  <--  a space after that quote. And notive also a space before the pipe
a"b

这样做没有错误。

出于某种原因,我不明白为什么。windows 的 grep 实现在查找引号时会给出有关尾随反斜杠的错误。

我不明白如何在 Linux 上使用 grep 产生等效的“尾随反斜杠”错误。

在 Linux 上,我可以收到有关尾随反斜杠的错误,但不会在末尾带有引号时收到错误。

# echo a\\b | grep \\
grep: Trailing backslash
#

# echo a\\b | grep "\\"
grep: Trailing backslash

我发现,要在 Linux 中查找单个反斜杠,我需要四个。因为 shell 会将四个变成两个。然后 grep 会将两个变成一个文字反斜杠。

# echo a\\b | grep \\\\
a\b
# echo a\\b | grep "\\\\"
a\b
#

而在 Linux 中,尾随的反斜杠意味着末尾有一个具有特殊含义的反斜杠,因为它没有被转义,并且没有执行任何操作。

# echo a\\b | grep \\
grep: Trailing backslash
#

只要我在末尾加上引号,就不会出现错误

# echo a\\b | grep \\\"
#
#

那么,为什么当我给出 windows 的 grep 实现中不以反斜杠结尾的东西时,它会给出关于尾随反斜杠的错误?

请注意,如果我从 cygwin 运行此程序,我不会收到有关尾随反斜杠的任何错误

$ echo a\"b | grep \"
a"b

从 cygwin 来看,它的行为与 linux 非常相似

因此在与 Linux 相同的情况下给出尾随反斜杠消息

$ echo a\\b | grep \\
grep: Trailing backslash

并且可以很好地转义反斜杠,并且最后的文字引用也没有问题。

$ echo a\\b | grep \\\\
a\b

$

$ echo a\\b | grep \\\\\"

$

另外,我使用的是 Win7,所以没有 WSL 功能

相关内容