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

Escaping a quote in findstr search string

提问人:Merlyn Morgan-Graham 提问时间:2/13/2011 更新时间:10/23/2023 访问量:22014

问:

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

例:

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

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

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

批处理文件 转义 引号 findstr

评论


答:

5赞 typo.pl 2/13/2011 #1

找到回复:FINDSTR 搜索 couble 报价并重定向/管道输出

Try this: 

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

我不知道为什么会这样。

但是,不适用于通过管道传输输出。查看相关链接管道 findstr 的输出

评论

0赞 Merlyn Morgan-Graham 2/13/2011
这使得它看起来你可以在中线进行文件重定向,然后传递参数?这让我对批处理文件的理解:)
0赞 jeb 2/13/2011
是的,允许在一行的前、中间或末尾进行重定向,甚至允许多次重定向,但只有最后一个才会生效。
9赞 Merlyn Morgan-Graham 2/13/2011 #2

如果我错了,请纠正我,但我想我已经想通了:

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
2赞 Andriy M 2/13/2011 #3

这还不够吗:

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

?

编辑

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

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

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

评论

0赞 Merlyn Morgan-Graham 2/14/2011
对于这个问题,是的。对于一般用途问题,例如搜索字符串中有空格,则不可以。
0赞 Andriy M 2/14/2011
@Merlyn Morgan-Graham:为一个更普遍的问题添加了解决方案。
0赞 Merlyn Morgan-Graham 2/14/2011
@Andriy:看看我的答案。它可以正确处理这样的情况 - ,当 blah.txt 仅包含行 .当涉及空格时,双引号并不能解决问题。findstr /c:"this is ""a test""" blah.txtthis is "a test"
0赞 Andriy M 2/14/2011
@Merlyn:事实上,我的解决方案似乎只有在您在内部(复制的)双引号后面的某个地方添加一个空格时才有效。即,这仍然有效(显示回声结果):。而这没有(抱怨无法打开“a”):。+1 到你的解决方案,我认为你应该接受它。echo this is "a test"|findstr /c:"this is ""a"echo this is "a test"|findstr /c:"this is ""a "
0赞 Merlyn Morgan-Graham 2/14/2011
@Andriy:不过,谢谢你的帮助。我不想添加所有逃避噪音......
4赞 Ciove 11/4/2016 #4

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

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"/>

评论

0赞 Larphoid 7/20/2018
鼎!正是我需要的!并且不知道您可以使用一个“/”:)指定多个选项,很好
0赞 M. Zoller 10/23/2023 #5

对于 findstr 程序和您正在使用的 shell,都必须对它们进行转义。https://ss64.com/nt/findstr-escapes.html

因此,如果从 powershell 运行,您的示例将是

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