Экранирование файла DOS для использования с командами *nix
Вопрос
Я хочу экранировать имя файла DOS, чтобы я мог использовать его с sed.У меня есть пакетный файл DOS, что-то вроде этого:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Примечание: %~f1
- расширяется %1
к полному имени пути - C:\utils\MyFile.txt
)
Я обнаружил, что обратная косая черта в %FILENAME%
просто экранируем следующую букву.
Как я могу удвоить их, чтобы они были экранированы?
(У меня установлен cygwin, поэтому не стесняйтесь использовать любые другие команды * nix)
Решение
Объединив предложения Джереми и Александру Неделку и используя | в качестве разделителя в команде sed, я получил
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
Решение
Это будет работать. Это грязно, потому что в BAT-файлах вы не можете использовать set var = `cmd`, как в unix.
Тот факт, что echo не понимает кавычки, также является беспорядочным и может привести к проблемам, если Some Pattern
содержит метасимволы оболочки.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Отредактировано]: Я удивлен, что это не сработало для вас. Я только что проверил это, и он работал на моей машине. Я использую sed из http://sourceforge.net/projects/unxutils и использую cmd.exe для Запустите эти команды в файле bat.
Другие советы
Вы можете попробовать как альтернативу (из командной строки) ...
> cygpath -m c:\some\path
c:/some/path
Как вы можете догадаться, он преобразует обратную косую черту в косую черту.
@Alexandru & Jeremy, Спасибо за вашу помощь.Вы оба получаете голоса против
@Джереми
Используя ваш метод, я получил следующую ошибку:
сэд:-e выражение #1, символ 8:незаконченная команда `s"
Если вы можете отредактировать свой ответ, чтобы он заработал, я бы принял его.(вставка моего решения не считается)
Обновить: Хорошо, я попробовал это с UnixUtils, и это сработало.(Для справки, загруженный мной UnixUtils датирован 1 марта 2007 года и использует GNU sed версии 3.02, моя установка Cygwin имеет GNU sed версии 4.1.5)