Bagaimana cara sed dan mengganti string dengan path folder

14

Saya mencoba menulis skrip bash berikut:

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

Baris yang ingin saya ubah dalam file adalah ini:

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

Jadi hasil akhirnya harus:

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

Tapi aku tidak mengerti ... kurasa itu karena melarikan diri karakter ...

Adakah yang bisa menjelaskan?

Terima kasih

Felipe Caldas
sumber
Anda maksud, s (h) ed beberapa cahaya
Alexandre Holden Daly

Jawaban:

23

Dalam keadaan di mana string pengganti atau string pola mengandung garis miring, Anda dapat menggunakan fakta bahwa GNU sed memungkinkan pembatas alternatif untuk perintah pengganti. Pilihan umum untuk pembatas adalah karakter pipa |atau hash #- pilihan terbaik untuk pembatas karakter sering tergantung pada jenis file yang sedang diproses. Dalam kasus Anda, Anda dapat mencoba

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

Perhatikan juga bahwa Anda salah mengetik nama variabel Anda $ HOME_DIR (tidak dimulai dengan garis bawah).

$ 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

Hanya saja Anda mungkin ingin menghindari penggunaan semua-kap untuk variabel pengguna dalam skrip Anda - mereka harus dicadangkan untuk variabel sistem. Juga gsaklar tidak diperlukan kecuali jika Anda ingin membuat beberapa pengganti pada satu baris.

Steeldriver
sumber
0

Hardcoding variabel 'opt / home' akan berfungsi seperti ini ..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
user_of_ubuntu_linux
sumber