在 findstr 搜索字符串中转义引号

Posted

技术标签:

【中文标题】在 findstr 搜索字符串中转义引号【英文标题】:Escaping a quote in findstr search string 【发布时间】:2011-06-26 08:24:58 【问题描述】:

使用 findstr.exe 时如何正确转义搜索字符串中的引号?

例子:

findstr /misc:"namespace=\"" *.cs > ns.txt

这会输出到控制台,而不是我指定的文件。

我直接在命令行上执行此操作,而不是在批处理文件中,尽管这些信息也可能有用。

【问题讨论】:

【参考方案1】:

根据我的测试,正确的转义字符是反斜杠:

c:\Temp>findstr /isc:"session id=\"59620\"" C:\Temp\logs\some*.xml
C:\Temp\logs\some_2016_11_03.xml: <session id="59620" remoteAddress="192.168.195.3:49885"/>

【讨论】:

叮!正是我需要的!并且不知道你可以用一个'/'指定多个选项:),很好【参考方案2】:

这还不够吗:

findstr /misc:namespace=^" *.cs > ns.txt

?

编辑

如果您正在寻找一种在带引号的参数中传递 " 字符的方法,那么它可能是(使用您的示例)

findstr /misc:"namespace=""" *.cs > ns.txt

" 字符在带引号的字符串中重复两次)。

【讨论】:

对于这个问题,是的。对于一般用途的问题,例如如果您的搜索字符串中有空格,则没有。 @Merlyn Morgan-Graham:为更普遍的问题添加了解决方案。 @Andriy:看看我的回答。当 blah.txt 仅包含行 this is "a test" 时,它可以正确处理诸如 findstr /c:"this is ""a test""" blah.txt 之类的情况。当涉及空格时,双引号不能解决问题。 @Merlyn:确实,我的解决方案似乎只有在您在内部(复制的)双引号之后 的某处添加空格之前才有效。即,这仍然有效(显示回显结果):echo this is "a test"|findstr /c:"this is ""a"。这并没有(抱怨无法打开'a'):echo this is "a test"|findstr /c:"this is ""a "。为您的解决方案 +1,我认为您应该接受它。 @Andriy:不过,感谢您的帮助。我不想添加所有的转义噪音......【参考方案3】:

如果我错了,请纠正我,但我想我已经弄清楚了:

findstr.exe /misc:^"namespace=\^"^" *.cs > ns.txt

这似乎给出了正确的输出,即使您的搜索字符串中有空格。它允许文件重定向、管道和其他文字在同一个 findstr.exe 调用中正常工作。

我问题中的原始命令不起作用,因为 cmd.exe 和 findstr.exe 都对 " 字符进行了特殊处理。我最终在 cmd.exe 的处理中得到了一组无与伦比的引号。

我的答案中的新命令有效,因为^" 允许引用从 cmd.exe 传递到 findstr.exe,而\" 告诉 findstr.exe 忽略该引用以进行命令处理,并将其视为字符文字。

编辑

嗯,我的解决方案是正确的,但它正确的原因是完全错误的。我写了一个小程序来测试一下。

我发现当我通过错误的命令行时,cmd.exe 会将此输入传递给程序:

test.exe /misc:namespace=" *.cs > ns.txt

在正确转义字符后,cmd.exe 将此输入传递给程序(并将输出重定向到文件):

test.exe /misc:namespace=" *.cs

【讨论】:

【参考方案4】:

找到Re: FINDSTR search for a couble quote and redirect/pipe the output

Try this: 

findstr > x.txt /S /I /M /C:"\.\"" * 

我不知道为什么会这样。

但不适用于管道输出。见相关链接piping findstr's output

【讨论】:

这看起来像是您可以在中线进行文件重定向,然后再传递参数?这让我对批处理文件的理解感到不安:) 是的,在一行的开头、中间或结尾都允许重定向,甚至允许多次重定向,但只有最后一个才会生效。

以上是关于在 findstr 搜索字符串中转义引号的主要内容,如果未能解决你的问题,请参考以下文章

在速度模板中转义引号

在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。

如何在单引号字符串中转义单引号

如何在字符串变量中转义引号? [复制]

在 shell 中的双引号字符串中转义反引号

在数据库查询字符串中转义引号的好方法?