Почему мой Perl однострочный не работает на Windows?

Из командной строки Windows я создаю текстовый файл всех файлов в каталоге:

dir c:\logfiles /B > config.txt

Выход:

0001_832ec657.log
0002_a7c8eafc.log

Мне нужно передать файл "config.txt" другому исполняемому файлу, но перед тем, как я это сделаю, мне нужно изменить файл, чтобы добавить некоторую дополнительную информацию, необходимую для исполняемого файла. Поэтому я использую следующую команду:

perl -p -i.bak -e 's/log/log,XYZ/g' config.txt

Я ожидаю, что результат будет:

0001_832ec657.log,XYZ
0002_a7c8eafc.log,XYZ

Однако файл "config.txt" не изменяется. Используя опцию -w, я получаю предупреждение:

Бесполезное использование константы в пустом контексте в строке -e 1.

Что я делаю неправильно?

3 ответа

Решение

Windows cmd.exe не использует ' только в качестве разделителей строк ", То, что вы делаете, эквивалентно:

perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txt

так -w жалуется "ты дал мне строку, но она ничего не делает".

Решение состоит в том, чтобы вместо этого использовать двойные кавычки:

perl -p -i.bak -e "s/log/log,XYZ/g" config.txt

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

добавление

cmd.exe просто очень неприятный зверь, для всех, кто привык shракушки Вот несколько других распространенных сбоев и обходных путей, касающихся perl призывание.

@REM не работает:
perl -e"print"
@REM работает:
perl -e"print"
@REM не работает:
perl -e "print \"Hello, world!\n\""
@REM работает:
perl -e "print qq(Привет, мир!\n)"

ephemient проблему, но у вас есть другой вариант: поменяйте оболочку с cmd.exe в лучшую оболочку. Если вы человек типа Unix, то я бы посоветовал заглянуть в Cygwin, который предоставляет среду, к которой вы привыкли (например, утилиты Bash и GNU).

Если вы человек типа Windows, я бы посоветовал взглянуть на PowerShell (или MSH, или Monad). На самом деле, я бы посоветовал заглянуть в PowerShell, даже если вы человек типа Unix. Он интегрируется с .NET и имеет множество полезных функций (например, объекты, передаваемые по каналам, а не простые строки текста). Если бы я застрял на Microsoft OS, это оболочка, которую я бы использовал.

Другие оболочки для Windows, которые людям нравятся:

Скрипт Perl работает из оболочки Linux. Может быть, вы не избегаете чего-то правильно.

Другие вопросы по тегам