Saya memiliki sebuah proyek Visual Studio, yang dikembangkan secara lokal. Kode file yang akan digunakan untuk remote server. Satu-satunya masalah adalah URLsthey yang mengandung hard-coded.
Proyek berisi URL seperti ?page=satu . Untuk link yang akan berlaku pada server, harus /page/satu .
I've memutuskan untuk mengganti semua URL yang saya codefiles dengan sed sebelum diberangkatkan, tapi aku'm terjebak pada garis miring.
Aku tahu ini bukan solusi, tapi itu's sederhana akan menghemat saya banyak waktu. Total jumlah string saya harus mengganti kurang dari 10. Jumlah file yang harus diperiksa adalah ~30.
Contoh yang menggambarkan situasi saya di bawah ini:
Perintah I'm 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&
Kandungan b.txt setelah saya menjalankan perintah sed:
pageone
pagetwo
pagethree
Apa yang saya inginkan b.txt mengandung:
/page/one
/page/two
/page/three
Cara termudah untuk menggunakan pembatas di cari/ganti baris, misalnya:
s:?page=one&:pageone:g
Anda dapat menggunakan karakter apapun sebagai pembatas yang's bukan bagian dari string. Atau, anda bisa melarikan diri dengan backslash:
s/\//foo/
Yang akan menggantikan /
dengan foo
. Anda'd ingin menggunakan lolos backslash dalam kasus di mana anda don't tahu karakter apa yang mungkin terjadi dalam string pengganti (jika mereka shell variabel, misalnya).
Sangat berguna tapi kurang dikenal fakta tentang sed yang akrab s/foo/bar/
perintah dapat menggunakan tanda baca, tidak hanya garis miring. Alternatif yang umum adalah s@foo@bar@
, dari mana ia menjadi jelas bagaimana untuk memecahkan masalah anda.
Dalam sistem saya berkembang, string yang akan diganti oleh sed adalah input teks dari pengguna yang disimpan dalam sebuah variabel dan diteruskan ke sed.
Seperti disebutkan sebelumnya pada posting ini, jika string yang terkandung dalam perintah sed blok berisi sebenarnya pembatas yang digunakan oleh sed - kemudian sed berakhir pada kesalahan sintaks. Perhatikan contoh berikut:
Ini bekerja:
$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345
Istirahat ini:
$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'
Mengganti default delimiter adalah bukan solusi kuat dalam kasus saya karena saya tidak ingin membatasi pengguna memasukkan karakter khusus yang digunakan oleh sed sebagai pemisah (misalnya "/").
Namun, melarikan diri setiap kejadian dari pembatas di input string akan memecahkan masalah. Pertimbangkan hal di bawah ini solusi secara sistematis melarikan diri pembatas karakter pada string masukan sebelum memiliki itu diurai oleh sed. Seperti melarikan diri dapat diimplementasikan sebagai pengganti menggunakan sed itu sendiri, penggantian ini adalah aman, bahkan jika string masukan berisi pembatas - ini adalah karena input string bukan merupakan bagian dari sed blok perintah:
$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6
Saya telah dikonversi ini untuk fungsi yang akan digunakan oleh berbagai script:
escapeForwardSlashes() {
# Validate parameters
if [ -z "$1" ]
then
echo -e "Error - no parameter specified!"
return 1
fi
# Perform replacement
echo ${1} | sed -e "s#/#\\\/#g"
return 0
}
baris ini harus bekerja untuk anda 3 contoh:
sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
-r
untuk menyimpan beberapa melarikan diri .tes dengan anda contoh (a.txt):
kent$ echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three
sed
adalah stream editor, dalam bahwa anda dapat menggunakan |
(pipa) untuk mengirim standar aliran (STDIN dan STDOUT khusus) melalui sed
dan mengubah mereka pemrograman dengan cepat, membuatnya menjadi alat yang berguna dalam filosofi Unix tradisi, tetapi dapat mengedit file secara langsung, juga menggunakan aku
parameter yang disebutkan di bawah ini.
Pertimbangkan hal berikut:
sed -i -e 's/few/asd/g' hello.txt
s/
digunakan untuk substitute yang menemukan ekspresi beberapa
dengan asd
:
beberapa, berani.
asd, berani.
/g
singkatan dari "global", yang berarti untuk melakukan hal ini untuk seluruh baris. Jika anda meninggalkan dari /g
(dengan s/beberapa/asd/
, selalu ada kebutuhan untuk menjadi tiga garis miring tidak peduli apa) dan beberapa
muncul dua kali pada baris yang sama, hanya yang pertama sedikit
berubah menjadi asd
:
beberapa laki-laki, beberapa perempuan, yang berani.
asd laki-laki, beberapa perempuan, yang berani.
Hal ini berguna dalam beberapa situasi, seperti mengubah karakter khusus di awal baris (misalnya, mengganti yang lebih besar dari simbol-simbol beberapa orang menggunakan untuk mengutip materi sebelumnya di thread email dengan tab horisontal sementara meninggalkan dikutip algebraic ketimpangan kemudian di baris tersentuh), tapi dalam contoh di mana anda menentukan bahwa dimana saja beberapa
terjadi itu harus diganti, pastikan anda memiliki yang g
.
Berikut ini dua pilihan (bendera) yang digabungkan menjadi satu, -yaitu
:
-i
pilihan ini digunakan untuk mengedit in tempat pada file hello.txt
.
-e
pilihan menunjukkan expression/perintah yang akan dijalankan, dalam hal ini s/
.
Catatan:'s penting bahwa anda menggunakan -i-e
untuk mencari/mengganti. Jika anda melakukan -ie
, anda membuat cadangan dari setiap berkas dengan surat 'e' ditambahkan.
Jawaban dari Anonim. \ memecahkan masalah saya ketika saya mencoba untuk melarikan diri kutipan di dalam HTML string.
Jadi jika anda menggunakan sed untuk kembali beberapa HTML template (pada server), menggunakan double backslash bukan tunggal:
var htmlTemplate = "<div style=\\"color:green;\\"></div>";
Yang sederhana alternatif adalah menggunakan AWK seperti pada jawaban ini:
awk '$0="awalan"$0' file > new_file