Tente isso
$ echo testdir=/tmp/testing | sed 's/\//\\//g'
testdir=\/tmp\/testing
Na variável
var=$(echo testdir=/tmp/testing | sed 's/\//\\//g')
Eu tenho uma string /tmp/testing
que quero substituir por \/tmp\/testing
sed
funciona bem da seguinte forma:
echo testdir=/tmp/testing | sed 's/\//\\//g'
testdir=\/tmp\/testing
No entanto, se eu tentar colocar isso em uma variável que quero usar mais tarde, recebo este erro:
myvar='echo testdir=/tmp/testing | sed 's/\//\\//g''
sed: -e expression #1, char 9: unknown option to 's'
Alguma idéia, por favor?
Os backticks '...'
adicionam um nível de indireção que requer outro conjunto de \
escapes. Se você usa $( ... )
, ele funciona corretamente e como esperado:
myvar=$(echo testdir=/tmp/testing | sed 's/\//\\//g')
echo "$myvar"
testdir=\/tmp\/testing
Se você insistir em usar backticks, isso funcionará:
myvar='echo testdir=/tmp/testing | sed 's/\//\\\//g''
echo "$myvar"
testdir=\/tmp\/testing
A barra invertida dentro dos backticks é um caso especial de algum tipo. Apenas mais uma razão para nunca usar backticks em vez de $(cmd)
. link
Você pode tornar a cotação de um lote mais legível usando um delimitador de padrão diferente quando seu padrão incluir /
. por exemplo,
myvar=$(printf '%s' "$oldpath" | sed 'sX/X\/Xg')
Ou se você sabe que está usando bash, então em vez de usar printf
para evitar echo
munging seus dados (por exemplo, se o nome do arquivo começar com -
), use apenas a manipulação pura de string.
myvar=${foo//\//\/} # sed 'sX/X\/Xg'
Isso é ainda mais ilegível, porque não há alternativa para /
como um delimitador. Melhor ainda, /
no início de um padrão significa substituir todas as ocorrências. Além disso, o padrão e a substituição são tratados de forma diferente. Não há trailing /
como os usos sed, portanto, você não precisa escapar de /
es na string de substituição. De qualquer forma, diferente de muitas maneiras do sed, o que significa que você provavelmente deveria deixar um comentário.
É "melhor" em desempenho e robustez, mas não é legibilidade ou portabilidade. Isso é par do curso com programação shell.
Você pode usar a substituição da variável bash
| substituição
testdir="${testdir//\//\\/}"
Tags sed