Como sed e substituir string com um caminho de pasta

12

Estou tentando escrever o seguinte script:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

A linha que eu quero que seja alterada nos arquivos é esta:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

Portanto, o resultado final deve ser:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

Mas eu não entendo isso ... Eu acho que é por causa de chars de escape ...

Alguém pode lançar alguma luz?

Obrigado

    
por Felipe Caldas 22.01.2014 / 02:34

2 respostas

21

Em circunstâncias em que a string de substituição ou string padrão contenha barras, você pode usar o fato de que o GNU sed permite um delimitador alternativo para o comando substituto. As opções comuns para o delimitador são o caractere de pipe | ou o hash # - a melhor opção de caractere delimitador geralmente dependerá do tipo de arquivo que está sendo processado. No seu caso, você pode tentar

sed -i "s#_HOME_DIR_#$HOME_DIR#"

Observe também que você digitou incorretamente o nome da variável $ HOME_DIR (ele não inicia com um sublinhado).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

Apenas fyi você pode querer evitar o uso de letras maiúsculas para variáveis do usuário em seu script - elas devem ser reservadas para as variáveis do sistema. Além disso, a opção g não é necessária, a menos que você queira fazer várias substituições em uma única linha.

    
por steeldriver 22.01.2014 / 03:54
0

Codificar a variável 'opt / home' funcionará assim.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
    
por user_of_ubuntu_linux 22.01.2014 / 03:00