Cmd 如何使用GNU grep for windows/dos转义双引号?

Cmd 如何使用GNU grep for windows/dos转义双引号?,cmd,grep,gnu,Cmd,Grep,Gnu,我想找一个 Assembly=“Foobar 在所有文件中,并将输出定向到tmp.txt 我已经试过了(cmd/error) grep-r“Assembly=\“Foobar”。>>tmp.txt 错误(无效参数) grep-r“Assembly=”“Foobar”。>>tmp.txt 错误(空间不足) grep-r'Assembly=“Foobar.”>>tmp.txt 错误(空间不足) 非常令人沮丧。有什么建议吗?您需要担心grep和cmd.exe的转义引号 grep希望引号转义为\“ cm

我想找一个

Assembly=“Foobar

在所有文件中,并将输出定向到tmp.txt

我已经试过了(cmd/error)

grep-r“Assembly=\“Foobar”。>>tmp.txt 错误(无效参数)

grep-r“Assembly=”“Foobar”。>>tmp.txt
错误(空间不足)

grep-r'Assembly=“Foobar.”>>tmp.txt
错误(空间不足)


非常令人沮丧。有什么建议吗?

您需要担心grep和cmd.exe的转义引号

grep希望引号转义为
\“

cmd.exe将引号转义为
^“
。引号是一个状态机,意味着未转义的引号将打开和关闭引号语义。当引号打开时,诸如
>tmp.txt
之类的特殊字符不会被cmd.exe视为重定向,因此它会作为参数传递给grep

以下任何一项都有效:

grep -r "Assembly=\"Foobar^" . >>tmp.txt
grep -r ^"Assembly=\"Foobar" . >>tmp.txt
grep -r ^"Assembly=\^"Foobar^" . >>tmp.txt
grep -r Assembly=\^"Foobar . >>tmp.txt

如果您的搜索词中包含空格,那么grep需要括起来的引号,因此您需要前三种形式中的任何一种。最后一种形式不适用于搜索词中的空格。

可能与否重复,我已经看到/尝试过这一点。..grep-r^“Assembly=\“Foobar”。>>c:\temp\tmp.txt不确定“报价是状态机”是什么意思@WhiskerBiscuit-我更新了答案,试图改进状态机的描述。@dbenham,我没有得到前两个示例。在案例1)中,我将其视为:
“Assembly=”Foobar^“==”(SEM\u ON)Assembly=\(SEM\u OFF)Foobar^“===>Assembly=\Foobar”
,这似乎不是OP所期望的。此外,在示例2中,
“Assembly=”Foobar“=====”>“Assembly=”(SEM\u ON)Foobar(SEM\u OFF)==>“Assembly=”Foobar
。我一定错过了什么。你能告诉我哪里错了吗?@Julio-cmd.exe在打开或关闭引用语义时不会删除引号-引号会传递给grep。cmd.exe删除的唯一内容是
^
字符(前提是引号已关闭,因此它起转义作用)