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
Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top