2016-10-15 2 views
3

Я использую Ack версию 2.04, в powershell. Я хочу искать тексты вроде «jsonClass»: «Страница» (включая цитаты) внутри текстовых файлов.Как избежать двойных кавычек и двоеточия в ACK в powershell

Возможно, я не знаю, как правильно указывать и убегать.

ack -c --match '"jsonClass":"Page"' 

Не работает в powershell, я думаю, что он также выбирает одинарные кавычки. Сбрасывание двойных кавычек дает недопустимую ошибку регулярных выражений.

ack -c --match "\"jsonClass\":\"Page\"" 
    Invalid regex '\': 
    Trailing \ in regex m/\/ at C:\CHOCOL~1\lib\ACK2~1.04\content\ack.pl line 315 

Я попытался буквальный вариант, как хорошо, но я думаю, что извед-х интерпретации двоеточие как Params файлов.

ack -c -Q --match "jsonClass":"Page" 
    ack.pl: :Page: No such file or directory 

Любая идея, что мне не хватает?

EDIT: Я использую Powershell v2

+0

что такое команда/командлет/функция? – saftargholi

+0

@arashzgh http://beyondgrep.com/ – sas1138

+0

Я использую powerShell 2.0 – sas1138

ответ

4

если извед функция может случиться, что -c интерпретируется PowerShell вы можете проверить:

ack '-c' '--match' '"jsonClass":"Page"' 

-c --match следует интерпретировать как --match является значение параметра c в функции спросить

Если это попытка exe:

ack -c --match '\"jsonClass\":\"Page\"' 
+0

, похоже, это не проблема. – sas1138

+0

Я попробовал -c без кавычек на более простых шаблонах, и он возвращает ожидаемые результаты. 'ack -c -Q --match" Page "' – sas1138

+3

'ack' - это Perl-скрипт/модуль. Обратные косые черты необходимы, когда строка обрабатывается Perl. Либо '' \ "jsonClass \": \ "Страница \" ''или' '" \ '" jsonClass \ '": \ '" Page \ '" "' 'будет работать. –

5

В дополнение к JPBlanc's effective answer с PowerShell v3 + раствора:

При ссылающегося внешних программ, таких как ack , использование так называемого стоп разбора символа, --%, делает PowerShell передать оставшиеся аргументы через as-is, с исключение of expa nding cmd.exe -Style среды переменной ссылки, такие как %PATH%:

ack --% -c --match "\"jsonClass\":\"Page\"" 

Это позволяет сосредоточиться на убегающих правилах целевой программы только, не заботясь о сложном взаимодействии с собственным разборе PowerShell и убежать.

Таким образом, в PowerShell v3 или выше собственная попытка 2-го решения OP работала бы путем передачи --% в качестве первого параметра.

См. Get-Help about_Parsing.


Обратите внимание, что точного эквивалента вышеуказанной команды без использования --% (который также работает в pSV2 и, как правило, полезно , если вы хотите включить PowerShell раскрытых переменные/выражение в других аргументах) будет выглядеть следующим образом:

ack -c --match '"\"jsonClass\":\"Page\""' 

То есть, весь аргумент передается как есть заключена в с ingle цитирует, что гарантирует, что PowerShell не интерпретирует его.

Обратите внимание на внутреннее помещение ", которого нет в ответе JPBlanc (на момент написания этой статьи). Они гарантируют, что аргумент в конечном счете рассматривается как один аргумент на ack, даже если он содержит пробелы.

+0

Я использую PowerShell v2, и вышеупомянутое escaping не решает его, потому что кажется, что аргументы, переданные в ack, также включают обратную цитату – sas1138

+0

@ sas1138: Я переписал ответ. Теперь это полезно только пользователям PSv3 +, но поскольку вы не отметили свой пост как v2-only (пожалуйста, держите его таким образом сейчас), я решил, что покажу альтернативу PSv3 +, которая может быть полезна будущим читателям. (Ошибка моего первоначального ответа заключалась в том, что я пытался исправить вашу попытку решения _PowerShell, а не решить вашу исходную проблему, но обратите внимание, что обратные ссылки не были переданы 'ack', однако, поскольку обратная сторона - это PS '_own_ escape char .) – mklement0

+0

спасибо, я попытался отредактировать, но у меня не было достаточно прав для редактирования сообщений еще – sas1138

Смежные вопросы