O problema é que os dados de aspas duplas ainda serão processados pelo shell, removendo a barra invertida antes que ela atinja o sed ...
Em vez disso, tente aspas simples ou duplique as barras invertidas entre aspas duplas.
OK, isso é difícil de explicar, então vou dar um exemplo reproduzível:
Eu tenho um arquivo de texto test.txt
contém a linha:
somesetting-parameter /an/old/path
Eu quero substituí-lo por um caminho que eu possa obter via ls
, por exemplo:
ls /etc/init.d/ssh*
que gera /etc/init.d/ssh
(Debian) ou /etc/init.d/sshd
(outros)
Agora, para substituí-lo, eu queria usar sed
e usar o recurso de citações de retorno, por isso executei o comando:
sed -i "s/\/an\/old\/path/'ls /etc/init.d/ssh* | sed 's/\//\\//g''/" test.txt
mas está me dando o erro
sed: -e expression #1, char 9: unknown option to 's'
enquanto o comando (sub) ls /etc/init.d/ssh* | sed 's/\//\\//g'
está fornecendo a saída apropriada
\/etc\/init.d\/ssh
a tubulação é para o comando externo analisar as barras apropriadamente.
NOTA:
Eu sei que é facilmente realizável por um script de shell simplesmente usando uma variável, mas pedi para saber o que está errado, não para encontrar uma abordagem alternativa.
Tags command-line pipe sed linux shell