Como escapar do caminho do arquivo no SED?

40

Eu gostaria de substituir $fileWithPathem $file, no entanto, isso não funciona porque (eu acho) caminho não é escapado. Como escapar disso?

sed -i 's/${fileWithPath}/HAHA/g' $file
UAdapter
fonte

Respostas:

72
sed -i 's|'$fileWithPath'|HAHA|g' file

Aspas simples definem uma string literal. Colocar a variável fora do literal permite que o shell expanda essa parte.

Além disso: se você estiver analisando caminhos, use um delimitador no comando sed que não confunda com o delimitador de diretório "/".

ata
fonte
11
Cuidado que se $fileWithPathcontiver espaço em branco, o padrão incorreto será inserido.
precisa saber é o seguinte
Sua dica de bônus sobre como alterar o delimitador para caminhos de arquivo foi um salva-vidas!
Shadoninja
Eu acho que você tem muitas citações em seu comando. Meu exemplo sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnparece funcionar.
Léo Léopold Hertz ·
15

Uma maneira melhor de seqüências de caracteres literais com barras:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt
Jeff Lancaster
fonte
Este mereceu um Oscar! Simples e elegante
Toan Nguyen 08/11
15

Nas circunstâncias em que a cadeia de substituição ou a cadeia de padrão contenha barras, você pode usar o fato de que o GNU sed permite um delimitador alternativo para o comando substitute. Opções comuns para o delimitador são o caractere de barra | ou o hash # - a melhor opção para delimitar caracteres geralmente depende do tipo de arquivo que está sendo processado. No seu caso, você pode tentar

sed -i 's#'$fileWithPath'#HAHA#g' $file

O caractere 'g' após o último # é usado para alterar todas as ocorrências no arquivo se você precisar alterar apenas a primeira ocorrência e remova o 'g'.

c0m3t
fonte