Jak sed i zamienić ciąg na ścieżkę folderu

14

Próbuję napisać następujący skrypt bash:

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

Wiersz, który chcę zmienić w plikach, brzmi:

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

Tak więc wynikiem końcowym musi być:

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

Ale nie rozumiem tego ... Myślę, że to z powodu znaków ucieczki ...

Czy ktoś może rzucić nieco światła?

Dzięki

Felipe Caldas
źródło
masz na myśli, s (h) ed trochę światła
Alexandre Holden Daly

Odpowiedzi:

23

W okolicznościach, w których ciąg zastępujący lub ciąg wzorcowy zawiera ukośniki, możesz skorzystać z faktu, że GNU sed zezwala na alternatywny ogranicznik dla polecenia zastępczego. Typowe opcje dla separatora to znak potoku |lub skrót #- najlepszy wybór separatora często zależy od typu przetwarzanego pliku. W twoim przypadku możesz spróbować

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

Zauważ też, że źle wpisałeś nazwę zmiennej $ HOME_DIR (nie zaczyna się od znaku podkreślenia).

$ 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

Po prostu możesz chcieć unikać używania wielkich liter dla zmiennych użytkownika w skrypcie - powinny być one zarezerwowane dla zmiennych systemowych. Również gzmiana nie jest konieczna, chyba że chcesz dokonać wielu zamian w jednym wierszu.

steeldriver
źródło
0

Kodowanie na stałe zmiennej „opt / home” będzie działać w ten sposób ..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
user_of_ubuntu_linux
źródło