2008-08-29 1 views
3

Я хочу избежать имени файла DOS, поэтому я могу использовать его с sed. У меня есть DOS командного файл что-то вроде этого:DOS filename escaping для использования с командами * nix

set FILENAME=%~f1 

sed 's/Some Pattern/%FILENAME%/' inputfile 

(Примечание: %~f1 - расширяет %1 на полное имя пути - C:\utils\MyFile.txt)

я обнаружил, что слеш %FILENAME% просто спасаясь следующей буква ,

Как я могу удвоить их так, чтобы они были экранированы?

(я Cygwin установлен так, не стесняйтесь использовать любые другие команды * NIX)

Решение

Объединяя Джереми и Александр Nedelcu-ые годы предложения и использования | для разделителя в команде sed У меня есть

set FILENAME=%~f1 
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp 
sed -f sedcmd.tmp inputfile 
del /q sedcmd.tmp 

ответ

2

Это будет работать. Это грязно, потому что в BAT-файлах вы не можете использовать set var = `cmd`, как вы можете в unix. Тот факт, что эхо не понимает кавычки, также беспорядочен и может привести к неприятностям, если 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.

2

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

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

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

0

@Alexandru & Джереми, спасибо за вашу помощь. Вы оба получите upvotes

@Jeremy

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

sed: -e expression #1, char 8: unterminated `s' command

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

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

Смежные вопросы