7

我正在尝试寻找

装配="Foobar

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

我试过(cmd/错误)

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

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

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

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

4

1 回答 1

15

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

grep 期望引号被转义为\"

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

于 2013-11-06T15:56:10.827 回答