Como sed e substituir string por um caminho de pasta

14

Estou tentando escrever o seguinte script bash:

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

A linha que desejo alterar nos arquivos é a seguinte:

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

Portanto, o resultado final deve ser:

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

Mas não estou entendendo isso ... acho que é por causa dos caracteres de escape ...

Alguém pode lançar alguma luz?

obrigado

Felipe Caldas
fonte
quer dizer, s (h) ed alguma luz
Alexandre Holden Daly

Respostas:

23

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. As opções comuns para o delimitador são o caractere de pipe |ou o hash #- a melhor opção de caractere de delimitação geralmente depende 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 para evitar que você use all-caps para variáveis ​​de usuário em seu script - elas devem ser reservadas para variáveis ​​do sistema. Além disso, a gopção não é necessária, a menos que você queira fazer várias substituições em uma única linha.

chave de aço
fonte
0

A codificação codificada da variável 'opt / home' funcionará assim.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
user_of_ubuntu_linux
fonte