Экранирование имени файла DOS для использования с командами *nix



Я хочу избежать файла DOS, чтобы я мог использовать его с sed. У меня есть пакетный файл DOS примерно так:



set FILENAME=%~f1

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


(примечание: %~f1 - расширяет %1 до полного имени пути - C:utilsMyFile.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
681   3  

3 ответов:

Это сработает. Это грязно, потому что в 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, Спасибо за помощь. Вы оба получаете upvotes

@Jeremy

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

Sed: - e выражение #1, char 8: unterminated' s ' command

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

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

Comments

    Ничего не найдено.