Bagaimana cara menghindari path file di SED?


40

Saya ingin mengganti $fileWithPathdi $file, namun hal ini tidak bekerja karena (saya pikir) jalan tidak lolos. Bagaimana cara menghindarinya?

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

Jawaban:


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

Kutipan tunggal menentukan string literal. Menempatkan variabel di luar literal memungkinkan shell untuk memperluas bagian itu.

Juga: jika Anda akan mengurai path, gunakan pembatas dalam perintah sed yang tidak membingungkan dengan pembatas direktori "/".


1
Waspadalah bahwa jika $fileWithPathberisi spasi putih, pola yang salah dimasukkan.
Lekensteyn

Kiat bonus Anda tentang mengubah pembatas untuk jalur file adalah penyelamat hidup!
Shadoninja

Saya pikir Anda memiliki terlalu banyak kutipan dalam perintah Anda. Contoh saya sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnsepertinya berhasil.
Léo Léopold Hertz 준영

15

Cara yang lebih baik untuk string literal dengan garis miring ke depan:

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

Yang ini pantas mendapatkan Oscar! Sederhana dan elegan
Toan Nguyen

15

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 membatasi karakter akan sering bergantung pada jenis file yang sedang diproses. Dalam kasus Anda, Anda dapat mencoba

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

Karakter 'g' setelah # terakhir digunakan untuk mengubah semua kejadian dalam file jika Anda hanya perlu mengubah kejadian pertama, kemudian hapus 'g'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.