Почему мой 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. Может быть, вы не избегаете чего-то правильно.