为什么这里的 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 功能