如何使用GNU grep for windows / dos来避免双引号?

时间:2013-11-06 15:05:04

标签: cmd grep gnu

我正在尝试搜索

大会=“Foobar的

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

我试过(cmd / error)

  

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:13)

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

grep希望引号转义为\"

cmd.exe将引号转义为^"。引用是状态机,意味着未转义的引号切换引用语义开启和关闭。启用引号后,<|&等特殊字符将被视为文字。第一个未转义的引用打开引用语义。下一个报价将引用语义关闭。当引用为OFF时,只能转义引号。不平衡报价导致其余部分被引用。因此,在您的情况下,>>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需要包含引号,因此您需要前三个表单中的任何一个。最后一种形式不适用于搜索词中的空格。