Come sfuggire al percorso del file in SED?


40

Vorrei sostituire $fileWithPathin $file, tuttavia questo non funziona perché (credo) percorso non è sfuggito. Come sfuggire?

sed -i 's/${fileWithPath}/HAHA/g' $file

Risposte:


72
sed -i 's|'$fileWithPath'|HAHA|g' file

Le virgolette singole definiscono una stringa letterale. Mettere la variabile fuori dal valore letterale consente alla shell di espandere quella parte.

Inoltre: se si intende analizzare i percorsi, utilizzare un delimitatore nel comando sed che non confonda con il delimitatore di directory "/".


1
Attenzione che se $fileWithPathcontiene spazi bianchi, viene inserito il modello sbagliato.
Lekensteyn,

Il tuo suggerimento bonus sulla modifica del delimitatore per i percorsi dei file è stato un salvavita!
Shadoninja,

Penso che tu abbia troppe citazioni nel tuo comando. Il mio esempio sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnsembra funzionare.
Léo Léopold Hertz

15

Un modo migliore per stringhe letterali con barre in avanti:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt

Questo meritava un Oscar! Semplice ed elegante
Toan Nguyen l'

15

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 pipe | o l'hash # - la scelta migliore del carattere di delimitazione dipende spesso dal tipo di file in elaborazione. Nel tuo caso puoi provare

sed -i 's#'$fileWithPath'#HAHA#g' $file

Il carattere 'g' dopo l'ultimo # viene utilizzato per modificare tutte le occorrenze nel file se è necessario modificare solo la prima occorrenza, quindi rimuovere la '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.