Escape de nome de arquivo DOS para uso com comandos *nix
Pergunta
Quero escapar de um nome de arquivo DOS para poder usá-lo com sed.Eu tenho um arquivo em lote do DOS mais ou menos assim:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Observação: %~f1
- expande %1
para um nome de caminho totalmente qualificado - C:\utils\MyFile.txt
)
Descobri que as barras invertidas em %FILENAME%
estão apenas escapando da próxima letra.
Como posso dobrá-los para que escapem?
(Eu tenho o cygwin instalado, então fique à vontade para usar qualquer outro comando *nix)
Solução
Combinando as sugestões de Jeremy e Alexandru Nedelcu e usando | para o delimitador no comando sed que eu tenho
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
Solução
Isso funcionará.É confuso porque em arquivos BAT você não pode usar set var=`cmd` como no Unix.O fato de echo não entender aspas também é confuso e pode causar problemas se Some Pattern
contém metacaracteres do shell.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Editado]:Estou surpreso que não tenha funcionado para você.Acabei de testar e funcionou na minha máquina.Estou usando sed de http://sourceforge.net/projects/unxutils e usando cmd.exe para executar esses comandos em um arquivo bat.
Outras dicas
Você poderia tentar como alternativa (no prompt de comando) ...
> cygpath -m c:\some\path
c:/some/path
Como você pode imaginar, ele converte barras invertidas em barras.
@Alexandru e Jeremy, obrigado pela sua ajuda.Vocês dois recebem votos positivos
@Jeremy
Usando seu método, recebi o seguinte erro:
sed:-e expressão nº 1, caractere 8:comando `s' interminado
Se você puder editar sua resposta para que funcione, eu aceitarei.(colar minha solução não conta)
Atualizar: Ok, tentei com UnixUtils e funcionou.(Para referência, o UnixUtils que baixei foi datado de 1º de março de 2007 e usa GNU sed versão 3.02, minha instalação do Cygwin tem GNU sed versão 4.1.5)