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

问题描述 投票:0回答:5

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

示例:

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

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

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

batch-file escaping quotes findstr
5个回答
9
投票

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

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

5
投票

找到回复:FINDSTR 搜索一对引号并重定向/管道输出

Try this: 

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

我不知道为什么会这样。

但不适用于管道输出。请参阅相关链接管道findstr的输出


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

2
投票

这还不够吗:

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

编辑

如果您正在寻找一种在带引号的参数内传递

"
字符的方法,那么它可能是(使用您的示例)

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

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


0
投票

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

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

findstr /misc:"namespace=\`"" *.cs > ns.txt
© www.soinside.com 2019 - 2024. All rights reserved.