Экранирование кавычки в строке поиска findstr

Как правильно экранировать кавычки в строке поиска при использовании findstr.exe?

Пример:

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

Это выводится на консоль, а не в указанный мной файл.

Я делаю это непосредственно в командной строке, а не в пакетном файле, хотя эта информация тоже может быть полезна.


person Merlyn Morgan-Graham    schedule 13.02.2011    source источник


Ответы (4)


Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что понял это:

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
person Merlyn Morgan-Graham    schedule 13.02.2011

Найдено Re: FINDSTR найдите пару кавычек и перенаправьте/передайте вывод

Try this: 

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

Я понятия не имею, почему это работает.

Однако не работает для передачи вывода. См. связанную ссылку конвейерный вывод findstr

person typo.pl    schedule 13.02.2011
comment
Получается, что вы можете выполнять перенаправление файлов в середине строки, а затем передавать аргументы? Это расстраивает весь мой мир понимания пакетных файлов :) - person Merlyn Morgan-Graham; 13.02.2011
comment
Да, перенаправления разрешены в начале, середине или конце строки, разрешены даже множественные перенаправления, но только последнее вступит в силу. - person jeb; 13.02.2011

Согласно моим тестам, правильным escape-символом является обратная косая черта:

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"/>
person Ciove    schedule 04.11.2016
comment
динь! именно то, что мне было нужно! и не знал, что можно указать несколько опций с помощью одного '/' :), мило - person Larphoid; 19.07.2018

Разве этого не достаточно:

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

?

ИЗМЕНИТЬ

Если вы искали способ передать символ " внутри параметра в кавычках, то это могло бы быть (используя ваш пример)

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

(символ " повторяется дважды внутри строки в кавычках).

person Andriy M    schedule 13.02.2011
comment
Для этой проблемы да. Для проблемы общего назначения, например, если в строке поиска есть пробелы, нет. - person Merlyn Morgan-Graham; 14.02.2011
comment
@Merlyn Morgan-Graham: добавлено решение более общей проблемы. - person Andriy M; 14.02.2011
comment
@Andriy: посмотри мой ответ. Он правильно обрабатывает такие случаи, как этот - findstr /c:"this is ""a test""" blah.txt, когда blah.txt содержит только строку this is "a test". Двойные кавычки не решают проблему, когда используются пробелы. - person Merlyn Morgan-Graham; 14.02.2011
comment
@Merlyn: Действительно, мое решение работает только до тех пор, пока вы не добавите пробел где-то после внутренней (реплицированной) двойной кавычки. То есть это все еще работает (отображает эхо-результат): echo this is "a test"|findstr /c:"this is ""a". И это не (жалуется на то, что не может открыть 'а'): echo this is "a test"|findstr /c:"this is ""a ". +1 к вашему решению, я думаю, вы должны его принять. - person Andriy M; 14.02.2011
comment
@Andriy: Спасибо за помощь. Я бы не хотел добавлять весь этот убегающий шум... - person Merlyn Morgan-Graham; 14.02.2011
comment
Фу, командная строка Windows ужасна. Указание """" (четыре двойных кавычки подряд) передает одну двойную кавычку в качестве аргумента вызываемой программе, что мне и было нужно. - person We Are All Monica; 19.05.2011