DOS filename escaping for use with *nix commands


I want to escape a DOS filename so I can use it with sed. I have a DOS batch file something like this:

set FILENAME=%~f1

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

(Note: %~f1 - expands %1 to a Fully qualified path name - C:\utils\MyFile.txt)

I found that the backslashes in %FILENAME% are just escaping the next letter.

How can I double them up so that they are escaped?

(I have cygwin installed so feel free to use any other *nix commands)


Combining Jeremy and Alexandru Nedelcu's suggestions, and using | for the delimiter in the sed command I have

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


@Alexandru & Jeremy, Thanks for your help. You both get upvotes


Using your method I got the following error:

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

If you can edit your answer to make it work I'd accept it. (pasting my solution doesn't count)

Update: Ok, I tried it with UnixUtils and it worked. (For reference, the UnixUtils I downloaded was dated March 1, 2007, and uses GNU sed version 3.02, my Cygwin install has GNU sed version 4.1.5)

This will work. It's messy because in BAT files you can't use set var=\cmd\ like you can in unix. The fact that echo doesn't understand quotes is also messy, and could lead to trouble if Some Pattern contains shell meta characters.

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

[Edited]: I am suprised that it didn't work for you. I just tested it, and it worked on my machine. I am using sed from and using cmd.exe to run those commands in a bat file.

By : Jeremy

You could try as alternative (from the command prompt) ...

> cygpath -m c:\some\path

As you can guess, it converts backslashes to slashes.

This video can help you solving your question :)
By: admin