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


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.


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" {} \;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.