Dizeyi sed ile değiştirme ve klasör yolu değiştirme


14

Aşağıdaki bash betiği yazmaya çalışıyorum:

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

Dosyalarda değiştirmek istediğiniz satır şudur:

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

Sonuç olarak:

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

Ama bunu anlayamıyorum ... Sanırım bu kaçış karakterleri yüzünden ...

Biraz ışık tutabilecek olan var mı?

Teşekkürler


demek istedin, s (h) ed ışık
Alexandre Holden Daly

Yanıtlar:


23

Değiştirme dizesi veya desen dizesinin eğik çizgiler içerdiği durumlarda, GNU sed'in ikame komutu için alternatif bir sınırlayıcıya izin verdiği gerçeğinden yararlanabilirsiniz. Sınırlayıcı için ortak seçenekler, boru karakteri |veya karmasıdır #- en iyi sınırlayıcı karakter seçimi, genellikle işlenmekte olan dosyanın türüne bağlıdır. Senin durumunda deneyebilirsin

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

Ayrıca $ HOME_DIR değişken adınızı yanlış yazdığınızı da unutmayın (alt çizgi ile başlamaz).

$ 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

Sadece fyi, komut dosyanızdaki kullanıcı değişkenleri için all-caps kullanmaktan kaçınmak isteyebilirsiniz - sistem değişkenleri için ayrılmalıdır. Ayrıca, gtek bir satırda birden fazla değişiklik yapmak istemediğiniz sürece anahtar gerekli değildir.


0

'Opt / home' değişkeninin kodlanması şu şekilde çalışacaktır ..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.