Saya memiliki proyek Visual Studio, yang dikembangkan secara lokal. File kode harus dikerahkan ke server jauh. Satu-satunya masalah adalah URL yang mengandung kode-keras.
Proyek berisi URL seperti ? Halaman = satu . Agar tautan valid di server, tautannya harus / halaman / satu .
Saya telah memutuskan untuk mengganti semua URL di file code saya dengan sed sebelum penerapan, tapi saya terjebak pada garis miring.
Saya tahu ini bukan solusi yang bagus, tetapi sederhana akan menghemat banyak waktu. Total jumlah string yang harus saya ganti kurang dari 10. Jumlah total file yang harus diperiksa adalah ~ 30.
Contoh menggambarkan situasi saya di bawah ini:
Perintah saya menggunakan:
sed -f replace.txt < a.txt > b.txt
replace.txt yang berisi semua string:
s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
a.txt:
?page=one&
?page=two&
?page=three&
Konten b.txt setelah saya menjalankan perintah sed:
pageone
pagetwo
pagethree
Apa yang saya ingin b.txt mengandung:
/page/one
/page/two
/page/three
Jawaban:
Cara termudah adalah dengan menggunakan pembatas yang berbeda dalam pencarian Anda / ganti baris, misalnya:
Anda dapat menggunakan karakter apa pun sebagai pembatas yang bukan bagian dari string mana pun. Atau, Anda bisa menghindarinya dengan backslash:
Yang akan diganti
/
denganfoo
. Anda ingin menggunakan backslash yang lolos dalam kasus di mana Anda tidak tahu karakter apa yang mungkin terjadi dalam string pengganti (misalnya, mereka adalah variabel shell, misalnya).sumber
sed
perintah regex dimasukkan dalam tanda kutip ganda. Saya tidak menggunakannya dalam jawaban saya karena saya tidak menunjukkan seluruhsed
baris perintah tetapi hanyased
string perintah regex seperti yang telah dilakukan OP. Jika Anda memasukkannya ke dalam file, seperti OP, Anda tidak perlu tanda kutip.sed
perintah dalam skrip shell, maka mungkin backslash lebih banyak (setiap backslash perlu di-backslash lagi).The
s
perintah dapat menggunakan karakter apapun sebagai pembatas; karakter apa pun yang muncul setelahs
digunakan. Saya dibesarkan untuk menggunakan a#
. Seperti itu:sumber
Fakta yang sangat berguna tetapi kurang diketahui tentang sed adalah bahwa
s/foo/bar/
perintah yang akrab dapat menggunakan tanda baca apa pun, tidak hanya garis miring. Alternatif umum adalahs@foo@bar@
, dari situ menjadi jelas bagaimana menyelesaikan masalah Anda.sumber
tambahkan \ sebelum karakter khusus:
dll.
sumber
s/foo\/bar/foo_bar/
akan bekerja, tetapi/foo\/bar/foo_bar/
tidak akan.Dalam sistem yang saya kembangkan, string yang akan diganti oleh sed adalah input teks dari pengguna yang disimpan dalam variabel dan diteruskan ke sed.
Seperti disebutkan sebelumnya pada posting ini, jika string yang terkandung dalam blok perintah sed berisi pembatas aktual yang digunakan oleh sed - maka sed berakhir pada kesalahan sintaks. Perhatikan contoh berikut:
Ini bekerja:
Ini istirahat:
Mengganti pembatas default bukanlah solusi yang kuat dalam kasus saya karena saya tidak ingin membatasi pengguna untuk memasukkan karakter tertentu yang digunakan oleh sed sebagai pembatas (misalnya "/").
Namun, menghindari kemunculan pembatas dalam string input akan menyelesaikan masalah. Pertimbangkan solusi di bawah ini untuk secara sistematis keluar dari karakter pembatas di string input sebelum diuraikan oleh sed. Melarikan diri seperti itu dapat diimplementasikan sebagai pengganti menggunakan sed itu sendiri, penggantian ini aman bahkan jika string input berisi pembatas - ini karena string input bukan bagian dari blok perintah sed:
Saya telah mengonversikan ini ke fungsi yang akan digunakan oleh berbagai skrip:
sumber
VALUE="01\\\/01\\\/2018"
baris ini akan bekerja untuk 3 contoh Anda:
-r
untuk menyelamatkan beberapa melarikan diri.uji dengan contoh Anda (a.txt):
sumber
replace.txt
seharusnyasumber
Jawaban bagus dari Anonim. \ Memecahkan masalah saya ketika saya mencoba melarikan diri dari kutipan dalam string HTML.
Jadi, jika Anda menggunakan sed untuk mengembalikan beberapa templat HTML (di server), gunakan double backslash alih-alih tunggal:
sumber
sed
adalah s tream ed itor , karena Anda dapat menggunakan|
(pipa) untuk mengirim standar stream (STDIN dan STDOUT khusus) melaluised
dan mengubah mereka pemrograman dengan cepat, membuatnya menjadi alat yang berguna dalam tradisi filsafat Unix; tetapi dapat mengedit file secara langsung juga, menggunakan-i
parameter yang disebutkan di bawah ini.Pertimbangkan yang berikut ini :
s/
digunakan untuk s ubstitute ekspresi ditemukanfew
denganasd
:/g
singkatan "global", artinya melakukan ini untuk seluruh lini. Jika Anda meninggalkan/g
(dengans/few/asd/
, selalu harus ada tiga garis miring tidak peduli apa) danfew
muncul dua kali pada baris yang sama, hanya yang pertamafew
diubah menjadiasd
:Ini berguna dalam beberapa keadaan, seperti mengubah karakter khusus di awal baris (misalnya, mengganti simbol lebih besar dari yang digunakan beberapa orang untuk mengutip materi sebelumnya di utas email dengan tab horizontal sambil meninggalkan ketidaksamaan aljabar yang dikutip kemudian di baris tersebut). tidak tersentuh), tetapi dalam contoh Anda di mana Anda menentukan bahwa di mana saja
few
terjadi itu harus diganti, pastikan Anda memilikinya/g
.Dua opsi berikut (bendera) digabungkan menjadi satu
-ie
,:-i
Pilihan ini digunakan untuk mengedit i n tempat pada file tersebuthello.txt
.-e
Opsi menunjukkan e xpression / perintah untuk dijalankan, dalam hal inis/
.Catatan: Penting untuk Anda gunakan
-i -e
untuk mencari / mengganti. Jika Anda melakukannya-ie
, Anda membuat cadangan setiap file dengan huruf 'e' ditambahkan.sumber
Alternatif sederhana menggunakan AWK seperti pada jawaban ini :
awk '$0="prefix"$0' file > new_file
sumber