Escape del nome file DOS da utilizzare con i comandi *nix
Domanda
Voglio sfuggire a un nome file DOS in modo da poterlo usare con sed.Ho un file batch DOS simile a questo:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Nota: %~f1
- si espande %1
a un nome di percorso completo - C:\utils\MyFile.txt
)
Ho scoperto che le barre rovesciate in %FILENAME%
stanno semplicemente sfuggendo alla lettera successiva.
Come posso raddoppiarli in modo che vengano scappati?
(Ho installato Cygwin quindi sentiti libero di usare qualsiasi altro comando *nix)
Soluzione
Combinando i suggerimenti di Jeremy e Alexandru Nedelcu e usando | per il delimitatore nel comando sed che ho
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
Soluzione
Funzionerà.È complicato perché nei file BAT non puoi usare set var=`cmd` come puoi in Unix.Anche il fatto che echo non comprenda le virgolette è complicato e potrebbe causare problemi se Some Pattern
contiene metacaratteri della shell.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Modificato]:Sono sorpreso che non abbia funzionato per te.L'ho appena provato e ha funzionato sulla mia macchina.Sto usando sed from http://sourceforge.net/projects/unxutils e utilizzando cmd.exe per eseguire tali comandi in un file bat.
Altri suggerimenti
Potresti provare in alternativa (dal prompt dei comandi) ...
> cygpath -m c:\some\path
c:/some/path
Come puoi immaginare, converte le barre rovesciate in barre.
@Alexandru e Jeremy, grazie per il vostro aiuto.Entrambi ottenete voti positivi
@Jeremy
Usando il tuo metodo ho ricevuto il seguente errore:
sed:-e espressione n. 1, carattere 8:comando "s" senza terminazione
Se puoi modificare la tua risposta per farla funzionare, la accetterei.(incollare la mia soluzione non conta)
Aggiornamento: Ok, l'ho provato con UnixUtils e ha funzionato.(Per riferimento, UnixUtils che ho scaricato era datato 1 marzo 2007 e utilizza GNU sed versione 3.02, la mia installazione Cygwin ha GNU sed versione 4.1.5)