Gnuwin32 grep: конвейерный вывод в cmd.exe или Powershell

456
valerio

Я пытаюсь использовать команду Gnuwin32 grep для создания списка файлов, которые я хотел бы передать другой команде (на самом деле это Perl-скрипт). У меня есть куча файлов HTML, и я хочу перечислить каждый из них, который соответствует регулярному выражению itemprop=['"]description.

Теперь, после некоторых недоразумений, я обнаружил, что вызов cmd.exe

grep -i -E -l "itemprop=['\"]description" path/to/files/*.htm

работает нормально, но я не могу передать его вывод perl (или любой другой команде, в этом отношении):

grep -i -E -l "itemprop=['\"]description" path/to/files/*.htm | perl myscript.pl

выводит список файлов на терминал, после чего

grep: |: No such file or directory grep: perl: No such file or directory myscript.pl

греп лечит | и последующие слова в качестве аргументов. Как мне избежать этого?

Кроме того, я попытался преодолеть проблему с Powershell. Оттуда я могу просто передать по конвейеру (если я использую элементарное выражение, например "itemprop"), но у меня возникают проблемы с указанием выражения для поиска.

grep -i -E -l "itemprop=['\"]description" path/to/files/*.htm просто не работает. Powershell показывает мне знак >> Я даже не знаю, что это значит (ожидая большего ввода)? Я пробовал все способы избежать кавычек, но ни одна из них не работает. Иногда это оболочка, иногда grep, который жалуется на непревзойденного персонажа.

Любая помощь с благодарностью.

0

1 ответ на вопрос

0
MC ND

It seems you have found a collision on how quotes are handled by the different parsers involved. The simplest way to solve this case is just to escape the closing quote of the grep search expression

grep -iEl "itemprop=['\"]description^" path/to/files/*.htm | perl myscript.pl 
Очень хорошо, хотя я не понимаю, почему я должен избегать заключительной цитаты вместо средней. Тем временем я нашел другую работающую форму, а именно: grep -iEl "itemprop = ['\\" "] description" path / to / files / *. Htm | perl myscript.pl`, который, кажется, имеет смысл, когда вы добираетесь до этого безумного побега в середине. Также обратите внимание, что ни один из методов не работает в Powershell. valerio 8 лет назад 0