Я хочу избежать имени файла 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 и Джереми, спасибо за вашу помощь. Вы оба получаете голоса за
@ Джереми
Используя ваш метод, я получил следующую ошибку:
sed: -e expression #1, char 8: unterminated `s' command
Если вы можете отредактировать свой ответ, чтобы он работал, я его приму. (вставка моего решения не считается)
Обновлять: Хорошо, я попробовал с UnixUtils, и это сработало. (Для справки: загруженный мной UnixUtils датирован 1 марта 2007 г. и использует GNU sed версии 3.02, моя установка Cygwin имеет GNU sed версии 4.1.5)