As diferenças entre sed #,%, / e |

1

Estou tentando substituir uma string no banco de dados. Eu encontrei as possíveis soluções abaixo. Usando # ou % funciona para mim, mas não para / e | . Alguém pode explicar por que os dois primeiros trabalhos e quais são as diferenças entre eles, por favor?

find . -type f -name 'file.sql' -exec sed -i '' s#http://a.com#http://b.com#g {} +
find . -type f -name 'file.sql' -exec sed -i '' s%http://a.com%http://b.com%g {} +
find . -type f -name 'file.sql' -exec sed -i '' s/http://a.com/http://b.com/g {} +
find . -type f -name 'file.sql' -exec sed -i '' s|http://a.com|http://b.com|g {} +
    
por Stickers 04.06.2017 / 16:58

1 resposta

1

O comando de substituição de Sed normalmente usa / como o delimitador entre o comando s , a sequência de pesquisa, a sequência de substituição e quaisquer sinalizadores. Se, no entanto, a string de pesquisa ou a string de substituição puder conter / , as pessoas alterarão o delimitador para um caractere que não seja em nenhuma das strings.

Você recebeu o outro erro do sed quando lhe disse para usar uma string vazia como extensão de backup; já que você não está usando uma extensão, não coloque as aspas vazias.

Sed não se importa com o que o delimitador é, mas o seu shell ao redor pode.

O símbolo | introduz um pipe. Para usá-lo como um delimitador, você teria que citá-lo de alguma forma para protegê-los do shell.

O símbolo # pode introduzir uma sequência de comentários, com base no seu shell (bash só inicia um comentário se o # for o primeiro caractere de uma palavra), então é melhor ser seguro e citá-lo.

Como seus dados contêm / caracteres, você precisa usar um delimitador diferente ou escapar de todas as instâncias de / nas sequências de pesquisa e de substituição. Isso leva ao que é conhecido como síndrome do palito inclinado devido à aparência de difícil leitura do \/ .

Assim, você precisa de algo como:

find . -type f -name 'file.sql' -exec sed -i -e 's#http://a.com#http://b.com#g' {} +

ou

find . -type f -name 'file.sql' -exec sed -i -e 's|http://a.com|http://b.com|g' {} +

ou

find . -type f -name 'file.sql' -exec sed -i -e "s|http://a.com|http://b.com|g" {} +

ou

find . -type f -name 'file.sql' -exec sed -i -e 's/http:\/\/a.com/http:\/\/b.com/g' {} +
    
por 04.06.2017 / 17:10

Tags