Substitua “/” por “\ /”

4

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?

    
por Morph 10.09.2015 / 16:27

4 respostas

4

Tente isso

$ echo testdir=/tmp/testing | sed 's/\//\\//g'
testdir=\/tmp\/testing

Na variável

var=$(echo testdir=/tmp/testing | sed 's/\//\\//g')
    
por 10.09.2015 / 16:33
10

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
    
por 10.09.2015 / 16:34
4

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.

    
por 10.09.2015 / 16:47
2

Você pode usar a substituição da variável bash | substituição

testdir="${testdir//\//\\/}"
    
por 10.09.2015 / 17:04

Tags