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)
Solution
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
-
@John Millikin
I need to be able to call the script from my text editor (a windows app), so I have no choice in how the filename is passed. It has to be in the form
C:\utils\MyFile.txtFrom Sam Hasler -
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 ifSome Patterncontains 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 http://sourceforge.net/projects/unxutils and using cmd.exe to run those commands in a bat file.
From Jeremy -
You could try as alternative (from the command prompt) ...
> cygpath -m c:\some\path c:/some/pathAs you can guess, it converts backslashes to slashes.
From Alexandru Nedelcu -
@Alexandru & Jeremy, Thanks for your help. You both get upvotes
@Jeremy
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)
From Sam Hasler
0 comments:
Post a Comment