Имя файла DOS, экранирующее для использования с * nix командами - PullRequest
3 голосов
/ 30 августа 2008

Я хочу экранировать имя файла 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

Ответы [ 3 ]

2 голосов
/ 30 августа 2008

Вы можете попробовать как альтернативу (из командной строки) ...

> cygpath -m c:\some\path
c:/some/path

Как вы можете догадаться, он преобразует обратную косую черту в косую черту.

2 голосов
/ 30 августа 2008

Это будет работать. Это грязно, потому что в 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.

0 голосов
/ 30 августа 2008

@ Александру и Джереми, спасибо за вашу помощь. Вы оба получили голосов

@ Джереми

Используя ваш метод, я получил следующую ошибку:

sed: -e выражение # 1, символ 8: неопределенная команда `s '

Если вы сможете отредактировать свой ответ, чтобы он заработал, я бы его принял. (вставка моего решения не считается)

Обновление: Хорошо, я попробовал это с UnixUtils, и это сработало. (Для справки: загруженный мною UnixUtils датирован 1 марта 2007 года и использует GNU sed версии 3.02, моя установка Cygwin имеет GNU sed версии 4.1.5)

...