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

11

当我使用findstr.exe进行搜索时,如何正确转义引号?

例如:

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

我指定了输出到文件,但实际上输出到了控制台。

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

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

这看起来像是可以在一行中进行文件重定向,然后传递参数?这种情况打乱了我对批处理文件理解的整个世界 :) - Merlyn Morgan-Graham
是的,在行首、行中或行末都可以允许重定向,甚至允许多个重定向,但只有最后一个会生效。 - jeb

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

叮!正是我所需要的!而且我不知道你可以用一个“/”指定多个选项:),很好。 - Larphoid

2

这难道不已经足够了吗:

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

?

编辑

如果您正在寻找一种在引号参数内传递"字符的方法,那么可以使用以下方式(使用您的示例):

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

(在引号字符串中," 字符被重复两次)。


对于这个问题,是的。但对于一般性的问题,例如如果您的搜索字符串中有空格,则不行。 - Merlyn Morgan-Graham
@Merlyn Morgan-Graham:为一个更普遍的问题添加了解决方案。 - Andriy M
@Andriy:看看我的答案。它可以正确处理这种情况 - findstr /c:"this is ""a test""" blah.txt,当blah.txt只包含行this is "a test"时。当涉及到空格时,双引号并不能解决问题。 - Merlyn Morgan-Graham
@Merlyn:事实上,我的解决方案似乎只在您在内部(复制)双引号之后添加空格之前起作用。也就是说,这仍然可以工作(显示echo结果):“echo this is“a test”|findstr / c:“this is”“a””。而这个不行(抱怨无法打开'a'):“echo this is“a test”|findstr / c:“this is”“a ””。对您的解决方案加1,我认为您应该接受它。 - Andriy M
@Andriy:谢谢你的帮助。不过,我不想添加那么多转义噪音... - Merlyn Morgan-Graham
噫,Windows命令行太可怕了。指定 """" (四个双引号连续)将一个双引号作为参数传递给被调用的程序,这正是我所需要的。 - We Are All Monica

0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接