Persediaan untuk contoh sed
Berikut adalah panduan ringkas untuk menyiapkan contohnya, yang akan saya cuba untuk tidak membuat terlalu banyak.
"Kata-kata" adalah fail teks yang mengandungi nombor 1 hingga 100. Sekiranya anda tidak pasti perintah untuk membuatnya, lihat Fungsi eksport untuk xargs di Bash Export Command. Anda tidak akan pernah tahu bahawa ini mungkin berlaku dalam temu ramah skrip shell anda yang seterusnya.
"Bar" adalah fail teks yang mengandungi satu baris -.
"Old-php" adalah fail teks yang mengandungi baris PHP lama yang akan rosak di php7 atau lebih baru. (Petunjuk: ereg)
Perhatikan bahawa semua fungsi yang dijelaskan di atas boleh didapati di bawah di Catatan pada fungsi untuk penyediaan.
Contohnya dengan perintah yang setara
Dalam persekitaran baris perintah, anda akan dapati terdapat lebih daripada satu penyelesaian untuk tugas tertentu. Walau bagaimanapun, sebahagian besarnya, anda ingin mengikuti jalan yang menghasilkan rintangan paling sedikit. Berikut adalah senarai contoh perintah sed dengan perintah setara yang sesuai, di mana beberapa akan dibahas secara terperinci di bawah.
1. Cetak garis rawak (bersamaan dengan mengisih -R - | kepala -1)
sed -n "$ ((RANDOM% 100)) p" -2.Cetak baris terakhir dalam fail (bersamaan dengan kepala -1 -)
sed -n '$ p' -3. Cetak 10 baris pertama dalam fail (bersamaan dengan kepala -n 10 -)
sed '10q' -4. Cetak baris pertama dalam fail (bersamaan dengan ekor -1 -)
sed -n '1p' -5. Padamkan semua contoh watak (bersamaan dengan tr-hapus '0' -, di mana 0 adalah watak yang ingin kita hapuskan)
sed -e 's / 0 // g' -6. Tukar fail csv ke tsv (bersamaan dengan tr ', "\ t' -)
sed -e 's /, / \ t / g' -7.Tambahkan baris ke fail (setara dengan bar kucing -)
sed '$ a ---' -8. Garis tambah ke fail (setara dengan bar - bar)
sed '1i ---' -9. Cetak semua baris dalam fail (bersamaan dengan kucing -)
sed -n -e 'p' -10. Cetak garis yang sepadan dengan corak (bersamaan dengan grep -e '^ 1' -)
sed -n -e '/ ^ 1 / p' -11. Padamkan garis yang sepadan dengan corak (setara dengan grep -v -e '^ 1' -)
sed-e '/ ^ 1 / d' -12. Dapatkan bilangan baris dalam fail (bersamaan dengan wc -l -)
sed -n -e '$ =' -13. Tulis ke fail di latar belakang (perintah setara tee)
sed "w $ 1" -Contohnya menggunakan sed untuk melaksanakan perintah tee
Tepat di atas, ada contoh berlabel Tulis ke fail di latar belakang. Jenis bunyi seperti arahan tee. Baiklah. Di sini kita akan memperluas bagaimana menerapkan fungsi untuk menggantikan tee di bash menggunakan sed.
Perintah
tee ()uji $ # -eq 1 || kembali;
sed "w $ 1" -
utama ()
seq 10 | tee sepuluh;
kucing sepuluh
utama
Pengeluaran
12
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
Di sini anda akan melihat dua senarai bilangan bulat dari 1 hingga 10. Yang pertama adalah dari perintah seq. Yang kedua kami dapatkan dari kucing fail yang ditulis dalam tee. Saya tahu ia tidak masuk akal tetapi berjaya!
Contohnya menggunakan sed untuk mencetak garis rawak dalam fail
Anggaplah kita mahu mencetak garis rawak dalam fail menggunakan bash dan sedikit sed. Bolehkah kita melakukannya? Ya kita boleh! Ini caranya.
Laksanakan fungsi yang
- Mendapat bilangan baris dalam fail, L
- Menghasilkan nombor rawak antara 1 dan L, R
- Cetakan R
Fungsi mengharapkan input disalurkan dari luar.
Perintah
sebilangan baris ()fungsi lc ()
sed -n -e '$ =' -
;
garis cetak fungsi ()
sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
kucing -> $ temp;
kucing $ temp | garis cetak $ ((RANDOM% $ (kucing $ temp | lc) + 1));
rm $ temp
Contoh penggunaan (1)
seq 100 | _Keluaran (1)
35Contoh penggunaan (2)
curl https: // linuxhint.com / bash_cut_command / - senyap | label jalur | sebilanganLihat contoh di bawah, menggunakan sed untuk melucutkan tag HTML. Perhatikan bahawa contoh di atas kadang-kadang mengembalikan kosong untuk baris kosong. Sebagai latihan, ia dapat ditingkatkan.
Menggunakan sed untuk mencetak baris dalam fail
Anggaplah bahawa anda ingin melaksanakan fungsi dalam bash untuk mencetak baris tertentu dalam fail. Mencuba mencetak satu baris dalam fail menggunakan gelung dalam bash, kepala, ekor, atau awk terlalu banyak kerja untuk mencetak garis dalam fail. Perkara yang baik yang kita ada. Fungsi yang dihasilkan menggunakan sed adalah seperti berikut.
Perintah
garis cetak ()sed -n "$ 1 p" -
Sekarang mari kita lihat apa yang berlaku apabila kita menggunakan garis cetak pada perkataan.
Perintah
perkataan | garis cetak 50Pengeluaran
50baik. Nampak baik tapi mari kita mencuba sesuatu yang kelihatan tidak remeh.
Perintah
menyatakan -xf perkataanmenyatakan -xf garis cetak
seq 1 10 $ (perkataan | wc -l) | xargs -i bash -c "words | print-line "
Pengeluaran
111
21
31
41
51
61
71
81
91
baik. Sekarang lebih seperti itu! Anda melihat bagaimana sed dapat digunakan dalam skrip bash untuk mencetak garis apa pun dalam fail.
Contohnya tanpa arahan yang setara
Dalam persekitaran baris perintah, kadang-kadang jalan menuju penyelesaian yang menghasilkan rintangan paling sedikit adalah cara sed; jika tidak, anda akhirnya melakukan lebih banyak pekerjaan daripada yang diperlukan di tempat pertama. Beberapa arahan boleh dipaparkan di bawah.
Perintah semua baris dalam skrip shell
sed-e 's / ^ / # /' -Padamkan baris pertama
sed -e '1d' -
Padamkan baris terakhir
sed-e '$ d' -
Masukkan garis sebelum garis yang sepadan dengan corak
sed '/ 0 $ / i ---' -
Masukkan garis selepas garis yang sepadan dengan corak
sed '/ 0 $ / ---' -
Keluarkan tag html
sed-e /<[^>] *.// g ' -
Tingkatkan ereg dalam kod php lama untuk dijalankan dalam php7 atau lebih baru
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Periksa sama ada sed lebih awal daripada versi tertentu
sed -e 'v 4.5 ' -
Contoh percabangan versi sed dalam bash
Di atas dalam contohnya, ada garis untuk Memeriksa apakah sed lebih awal dari versi tertentu yang dapat kita gunakan untuk menerapkan versi percabangan dalam bash, yang saya percaya lebih mudah daripada mencoba menerapkan fungsi untuk membandingkan angka versi dari output sed -versi. Satu-satunya masalah ialah jika ada versi sed yang lebih awal yang tidak menyokong perintah v, maka kita berada dalam masalah.
Perintah
test-sed-version-at-most ()gema -n | sed "v $ 1" - 2> / dev / null
versi percubaan ()
echo -n "Versi $ 1. baik. Lakukannya ";
test-sed-version-at-most $ 1 &&
echo -n "lama";
benar
||
gema -n "baru"
;
gema "cara."
utama ()
tempatan v;
untuk v dalam 4.4,5;
buat
cuba-versi $ v;
selesai
utama
Pengeluaran
Versi 4.4. baik. Lakukan dengan cara lama.Versi 4.5. baik. Lakukan dengan cara baru.
Perhatikan bahawa versi sed yang berjalan di mesin saya untuk menaip watak-watak ini adalah 4.4, yang akan menjelaskan output di atas. Juga, pada masa yang sama, versi terbaru gnu sed adalah 4.7, lebih kurang 3 tahun lebih tua dari yang saya ada. Sedang saya sudah tua! Sebenarnya, dalam sed 4.0.6, parameter ditambahkan ke perintah versi sehingga strategi ini berfungsi untuk apa pun yang dikatakan sekurang-kurangnya v4.0.6, yang ringan kerana versi itu dikeluarkan pada awal tahun 2003. Anda baik.
Saya melakukan penggalian tambahan, sebenarnya BERITA membaca kod sumber terkini. Versi 4.6 mempunyai ciri baru, -debug yang membuang skrip dan memberi garisan output. Ini membolehkan anda menerjemahkan skrip sed yang dihasilkan oleh fungsi dalam bentuk bash ke kanonikal. Sejuk! Jangan lupa bahawa anda memerlukan versi percabangan di bash. Di sinilah contoh sed ini dimainkan.
Contoh fungsi bash menggunakan sed untuk melucutkan tag HTML
Dalam contoh di atas terdapat garis untuk menghilangkan tag HTML. Mari kita masukkan ke dalam fungsi bash dan gunakan untuk menghilangkan semua tag HTML dari artikel terakhir yang saya tulis.
Perintah
tanda jalur ()sed-e /<[^>] *.// g ' -
curl https: // linuxhint.com / bash_cut_command / - senyap | tegangan
Saya tidak boleh mengatakan bahawa ia sempurna tetapi sekurang-kurangnya ia boleh dibaca di terminal.
Contoh Sed dengan aliran kerja: Contoh alur kerja: ganti semua selamat menggunakan find, grep, dan sed
Adalah selamat untuk mengatakan bahawa perubahan yang dibuat menggunakan sed dengan pilihan -i tidak dapat dipulihkan. Ini adalah kecuali anda benar-benar yakin teks apa yang akan diganti, anda mungkin akan mempunyai satu watak yang kurang daripada yang dimaksudkan. Itulah sebabnya dalam contoh ini, kami akan menggunakan sed dalam aliran kerja untuk mengganti teks dengan selamat dalam semua fail yang telah anda pilih.
Aliran Kerja
- cari
- grep
- sed
cari
Di sini anda akan memilih fail yang akan diganti. Saya cadangkan menggunakan arahan seperti berikut:
cari -jenis f -nama | grep -v -e | xargs -i ..Sebagai contoh, anda mungkin mahu menghadkan fail untuk menggantikan fail PHP tidak termasuk direktori git repositori seperti berikut.
cari -jenis f -nama \ *.php | grep -v -e '.git '| xargs -i ..Baca lebih lanjut mengenai perintah xargs dalam bash.
grep
Seterusnya, kita akan mencuba dan memadankan beberapa_pattern dalam fail yang dipilih seperti berikut. Perhatikan bahawa kerana kita menggunakan pilihan -o untuk grep, output hanya akan menunjukkan rentetan yang sesuai jika ada.
cari -jenis f -nama \ *.php | grep -v -e '.git '|xargs -i grep -e some_pattern -o
Perintah di atas harus mengembalikan senarai rentetan yang sepadan dengan some_pattern.
sed
Akhirnya, kami mahu mengganti semua rentetan yang sepadan dengan beberapa_pattern. Untuk melakukan itu, kita perlu menukar grep menjadi sed seperti berikut.
cari -jenis f -nama \ *.php | grep -v -e '.git '|xargs -i sed -i -e s / some_pattern / penggantian / g
Perintah grep menjadi sed -i dan pilihan -o dikeluarkan. Dan di sana anda memilikinya.
Sekarang anda boleh memeriksa rentetan apa yang akan diganti sebelumnya dan bukannya menguji nasib anda.
Catatan pada pilihan yang digunakan dalam contoh
Berikut adalah senarai pilihan yang digunakan dalam contoh sed yang dibincangkan secara ringkas.
Pilihan | Penerangan |
-i | Edit di tempat. Sekiranya input adalah fail (tidak dimasukkan) hasil ekspresi akan menimpa kandungan fail. Sed menerima satu cth) sed -n .. |
-e | -e bermaksud ungkapan. Parameternya adalah ungkapan dalam bahasa sed. Sed menerima banyak cth: sed -e 'expr1' -e 'expr2'…
|
-n | Hides line tidak terpengaruh oleh ungkapan. Iaitu jika ungkapan itu adalah pernyataan cetak dalam bahasa sed, maka baris yang tidak termasuk dalam pernyataan cetak tidak akan disertakan dalam output. cth) sed -n ..
|
Untuk lebih banyak mengenai pilihan sed yang ada, lihat sed -help
Catatan akhir pada arahan yang setara digunakan dalam contoh
Utiliti baris perintah berikut dimasukkan dalam contoh sed dengan perintah yang setara.
- mengurut
- kepala
- ekor
- grep
- kucing
- Tr
- tee
Catatan pada trailing - contohnya perintah yang setara
Sekiranya anda tertanya-tanya apa yang berlaku - watak dalam contoh, nota ini adalah untuk anda. Saya menambahkan watak - watak setelah kebanyakan perintah dalam contoh menunjukkan bahawa kami mengharapkan input diterima melalui paip. Itu dia,
kucing beberapa fail | urutkan -R - | kepala -1Namun, apabila arahan di sebelah kiri paip ada, kita dapat menghilangkan petunjuk seperti berikut.
kucing beberapa fail | urutkan -R | kepala -1Itulah yang berlaku dengan perintah - watak selepas perintah dalam contoh.
Catatan pada fungsi untuk persediaan
Sekiranya anda mencari, berikut adalah fungsi penyediaan untuk contoh di atas. Output yang diperoleh menggunakan menyatakan -f. Baca lebih lanjut mengenai perintah menyatakan dalam bash untuk lebih banyak penggunaan.
Perintah
perkataan ()seq 100
bar ()
gema ---
lama-php ()
echo 'ereg ($ UA, "Bottybot")'
Pokoknya
Saya seronok menulis contoh Bash sed dan juga mengambil beberapa muslihat tambahan sepanjang perjalanan. Sed adalah utiliti baris perintah dan bahasa ekspresif yang kuat untuk memanipulasi fail teks. Sekiranya anda suka belajar tentang sed, jangan bimbang masih banyak lagi yang perlu disentuh. Sedap.