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
UAdapter
sumber

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 "/".

ata
sumber
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
Jeff Lancaster
sumber
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'.

c0m3t
sumber