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


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.


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" {} \;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.