Come sed e sostituire la stringa con un percorso di cartella


14

Sto cercando di scrivere il seguente script bash:

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

La riga che voglio essere modificata nei file è questa:

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

Quindi il risultato finale deve essere:

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

Ma non lo capisco ... immagino sia per via dei caratteri di fuga ...

Qualcuno può fare luce?

Grazie


vuoi dire, s (h) ed un po 'di luce
Alexandre Holden Daly,

Risposte:


23

In circostanze in cui la stringa sostitutiva o la stringa del motivo contengono barre, è possibile sfruttare il fatto che GNU sed consente un delimitatore alternativo per il comando sostitutivo. Le scelte comuni per il delimitatore sono il carattere di pipe |o l'hash #: la scelta migliore del carattere di delimitazione dipenderà spesso dal tipo di file in elaborazione. Nel tuo caso puoi provare

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

Si noti inoltre che è stato digitato in modo errato il nome della variabile $ HOME_DIR (non inizia con un trattino basso).

$ 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

Però potresti voler evitare l'uso di maiuscole per le variabili utente nel tuo script: dovrebbero essere riservate alle variabili di sistema. Inoltre, l' ginterruttore non è necessario a meno che non si desideri effettuare più sostituzioni su una sola riga.


0

La codifica hardware della variabile 'opt / home' funzionerà in questo modo.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.