Perkenalan
- 4149
- 110
- John Ratke
Selamat datang di bagian kedua dari seri kami, bagian yang akan fokus pada SED, versi GNU. Seperti yang akan Anda lihat, ada beberapa varian SED, yang tersedia untuk beberapa platform, tetapi kami akan fokus pada Versi Sed GNU 4.X. Banyak dari Anda sudah mendengar tentang SED dan sudah menggunakannya, terutama sebagai alat substitusi. Tapi itu hanya segmen dari apa yang bisa dilakukan sed, dan kami akan melakukan yang terbaik untuk menunjukkan kepada Anda sebanyak mungkin dari apa yang dapat Anda lakukan dengannya. Namanya adalah singkatan dari Stream Editor, dan di sini "Stream" dapat berupa file, pipa atau hanya stdin. Kami berharap Anda memiliki pengetahuan Linux dasar dan jika Anda sudah bekerja dengan ekspresi reguler atau setidaknya tahu apa itu RegExp, semakin baik. Kami tidak memiliki ruang untuk tutorial lengkap tentang ekspresi reguler, jadi sebaliknya kami hanya akan memberi Anda ide dasar dan banyak contoh sed. Ada banyak dokumen yang membahas subjek, dan kami bahkan akan memiliki beberapa rekomendasi, seperti yang akan Anda lihat dalam satu menit.
Instalasi
Tidak banyak yang bisa diceritakan di sini, karena kemungkinan Anda sudah menginstal sed, karena digunakan dalam berbagai skrip sistem dan alat yang sangat berharga dalam kehidupan pengguna Linux yang ingin menjadi efisien. Anda dapat menguji versi apa yang Anda miliki dengan mengetik
$ sed --version
Di sistem saya, perintah ini memberi tahu saya bahwa saya memiliki gnu sed 4.2.1 diinstal, ditambah tautan ke halaman beranda dan hal -hal bermanfaat lainnya. Paket ini dinamai 'sed'.
Konsep
Sebelum kita melangkah lebih jauh, kita merasa penting untuk menunjukkan Apa Tepatnya, sed itu, karena "editor aliran" mungkin tidak terlalu banyak membunyikan lonceng. SED mengambil teks input, apakah operasi yang ditentukan pada setiap baris (kecuali ditentukan lain) dan mencetak teks yang dimodifikasi. Operasi yang ditentukan dapat ditambahkan, menyisipkan, menghapus atau menggantikan. Ini tidak sesederhana terlihat: diperingatkan sebelumnya bahwa ada banyak pilihan dan kombinasi yang dapat membuat perintah sed agak sulit dicerna. Jadi jika Anda ingin menggunakan SED, kami sarankan Anda mempelajari dasar -dasar RegExps, dan Anda dapat menangkap sisanya saat Anda pergi. Sebelum kami memulai tutorial, kami ingin berterima kasih kepada Eric Pement dan lainnya atas inspirasi dan untuk apa yang telah ia lakukan untuk semua orang yang ingin belajar dan menggunakan SED.
Ekspresi reguler
Karena perintah/skrip SED cenderung menjadi samar, kami merasa bahwa pembaca kami harus memahami konsep dasar alih -alih menyalin dan menempel secara membabi buta perintah yang tidak mereka ketahui artinya. Ketika seseorang ingin memahami apa itu regexp, kata kuncinya adalah "mencocokkan". Atau bahkan lebih baik, "pencocokan pola". Misalnya, dalam laporan untuk departemen SDM Anda, Anda menulis nama Nick saat merujuk pada arsitek jaringan. Tapi Nick pindah dan John datang untuk menggantikannya, jadi sekarang Anda harus mengganti kata Nick dengan John. Jika file disebut laporan.txt, kamu bisa melakukannya
Laporan $ CAT.txt | Sed 'S/Nick/John/G'> Report_new.txt
Secara default Sed menggunakan stdout, jadi Anda mungkin ingin menggunakan operator pengalihan shell Anda, seperti pada contoh kami di bawah ini. Ini adalah contoh yang paling sederhana, tetapi kami mengilustrasikan beberapa poin: kami mencocokkan pola "Nick" dan kami mengganti semua contoh dengan "John". Perhatikan bahwa SED peka case, jadi hati-hati dan periksa file output Anda untuk melihat apakah semua substitusi dibuat. Di atas bisa ditulis juga seperti ini:
Laporan $ sed 'S/Nick/John/G'.txt> Report_new.txt
Oke, tapi di mana ekspresi regulernya, Anda bertanya? Nah, pertama -tama kami ingin membuat kaki Anda basah dengan konsep pencocokan dan inilah bagian yang menarik.
Jika Anda tidak yakin jika Anda menulis "Nick" karena kesalahan alih -alih "Nick" dan ingin mencocokkannya juga, Anda bisa menggunakan Sed 'S/Nick | Nick/John/G'. Bilah vertikal memiliki arti yang sama dengan yang mungkin Anda ketahui jika Anda menggunakan C, yaitu, ekspresi Anda akan cocok dengan Nick atau Nick. Seperti yang akan Anda lihat, pipa dapat digunakan dengan cara lain juga, tetapi artinya akan tetap ada. Operator lain yang banyak digunakan dalam regexps '?', yang cocok dengan nol atau satu contoh elemen sebelumnya (Flavou?r akan cocok dengan rasa dan rasa), '*' berarti nol atau lebih dan '+' cocok dengan satu atau lebih elemen. '^' cocok dengan awal string, sementara '$' melakukan yang sebaliknya. Jika Anda adalah pengguna VI (M), beberapa hal ini mungkin terlihat akrab. Lagipula, utilitas ini, bersama dengan AWK atau C berakar pada hari -hari awal UNIX. Kami tidak akan bersikeras lagi pada subjek, karena hal -hal akan menjadi lebih sederhana dengan membaca contoh, tetapi yang harus Anda ketahui adalah bahwa ada berbagai implementasi regexps: POSIX, POSIX Extended, Perl atau berbagai implementasi ekspresi reguler fuzzy, yang dijamin akan memberikan Anda sakit kepala.
Contoh sed
Mempelajari perintah linux sed dengan contoh | |
---|---|
Sintaks perintah Linux | Deskripsi Perintah Linux |
Sed 'S/Nick/John/G' Report.txt | Ganti setiap kejadian Nick dengan John dalam laporan.txt |
Sed 'S/Nick | Nick/John/G' Report.txt | Ganti setiap kejadian Nick atau Nick dengan John. |
file sed 's/^//'.txt> file_new.txt | Tambahkan 8 ruang di sebelah kiri teks untuk pencetakan yang cantik. |
sed -n '/tentu saja/,/perhatian Anda \ | Tampilkan hanya satu paragraf, dimulai dengan "tentu saja" dan berakhir dengan "Perhatian yang Anda bayar" |
file sed -n 12,18p.txt | Tampilkan hanya baris 12-18 file.txt |
File Sed 12,18d.txt | Tunjukkan semua file.txt kecuali untuk garis dari 12 hingga 18 |
File sed G.txt | File ruang ganda.txt |
skrip sed -f.file sed.txt | Tulis semua perintah dalam skrip.sed dan melaksanakannya |
sed '5!s/ham/keju/'file.txt | Ganti ham dengan keju dalam file.txt kecuali di baris ke -5 |
file sed '$ d'.txt | Hapus baris terakhir |
Sed '/[0-9] \ 3 \/p' file.txt | Cetak hanya baris dengan tiga digit berturut -turut |
sed '/boom/!file s/aaa/bb/'.txt | Kecuali boom ditemukan ganti AAA dengan BB |
file sed '17,/disk/d '.txt | Hapus semua baris dari baris 17 ke 'disk' |
Echo One Two | sed "s/satu/unos/i" | Menggantikan satu dengan UNOS dengan cara yang tidak sensitif, Jadi itu akan mencetak "unos dua" |
file sed 'g; g'.txt | Tiga-ruang file |
Sed's/ S.$ // 'file.txt | Cara untuk menggantikan dos2unix 🙂 |
Sed 's/ ^[ ^t]*//' file.txt | Hapus semua spasi di depan setiap baris file.txt |
Sed 's/[ ^t]*$ //' file.txt | Hapus semua spasi di akhir setiap baris file.txt |
Sed 'S/ ^[ ^t]*//; s/[ ^]*$ //' file.txt | Hapus semua spasi di depan dan di ujung setiap baris file.txt |
file sed 's/foo/bar/'.txt | Ganti foo dengan bilah hanya untuk contoh pertama dalam satu baris. |
file sed 's/foo/bar/4'.txt | Ganti foo dengan bilah hanya untuk instance ke -4 dalam satu baris. |
file sed 's/foo/bar/g'.txt | Ganti foo dengan bilah untuk semua contoh dalam satu baris. |
Sed '/baz/s/foo/bar/g' file.txt | Hanya jika garis berisi baz, ganti foo dengan batang |
SED '/./,/^$/!D 'file.txt | Hapus semua baris kosong berturut -turut kecuali untuk EOF |
Sed '/^$/n;/\ n $/d' file.txt | Hapus semua baris kosong berturut -turut, tetapi memungkinkan Hanya garis kosong atas |
SED '/./, $!D 'file.txt | Hapus semua baris kosong terkemuka |
sed -e: a -e '/^\ n*$/$ d; n;;/\ n $/ba' \ | Hapus semua garis kosong trailing |
sed -e: a -e '/\\ $/n; s/\\ n //; ta '\ | Jika file berakhir dengan backslash, bergabunglah dengan yang berikutnya (berguna untuk skrip shell) |
sed '/regex/,+5/expr/' | Cocokkan regex plus 5 baris berikutnya |
file sed '1 ~ 3d'.txt | Hapus setiap baris ketiga, dimulai dengan yang pertama |
file sed -n '2 ~ 5p'.txt | Cetak setiap baris ke -5 dimulai dengan yang kedua |
Sed 's/[nn] ick/John/g' laporan.txt | Cara lain untuk menulis beberapa contoh di atas. Bisakah Anda menebak yang mana? |
Sed -n '/re/p; q;' file.txt | Cetak hanya pertandingan pertama Re (ekspresi reguler) |
Sed '0,/re/// d;' file.txt | Hapus hanya pertandingan pertama |
Sed '0,/re/s // to_that/' file.txt | Ubah hanya pertandingan pertama |
Sed 'S/^[^,]*,/9999,/' file.CSV | Ubah bidang pertama menjadi 9999 dalam file CSV |
s/^ *\ (.*[^] \) *$/| \ 1 |/; | Skrip SED untuk mengonversi file CSV menjadi dipisahkan (hanya bekerja pada beberapa jenis CSV, dengan “s dan koma yang tertanam) |
sed ': a; s/\ (^\ | [^0-9.] \) \ ([0-9] \+\) \\ | Ubah nomor dari file.txt dari 1234.56 bentuk menjadi 1.234.56 |
sed -r "s/\<(reg|exp)[a-z]+/\U&/g" | Konversi kata apa pun yang dimulai dengan reg atau exp ke huruf besar |
Sed '1,20 S/Johnson/White/G' File.txt | Melakukan penggantian Johnson dengan putih hanya garis antara 1 dan 20 |
sed '1,20 !S/Johnson/White/G 'File.txt | Di atas terbalik (cocokkan semua kecuali baris 1-20) |
sed '/from/,/sampai/s/\/magenta/g; \ | Ganti hanya antara "dari" dan "sampai" |
sed '/endnotes:/, $ s/schaff/herzog/g; \ | Ganti hanya dari kata "catatan akhir:" sampai EOF |
SED '/./H; $!d;; x;/regex/!D 'file.txt | Cetak paragraf hanya jika berisi regex |
sed -e '/./H; $!d; '-e' x;/re1/!D;\ | Cetak paragraf hanya jika berisi RE1, RE2 dan RE3 |
sed ': a; /\\ $/n; s/\\ n //; file ta.txt | Bergabunglah dengan dua baris di ujung pertama dalam backslash |
Sed 'S/14 "/Fourteen Inches/G' File.txt | Beginilah cara Anda dapat menggunakan kutipan ganda |
sed 's/\/beberapa \/unix \/path/\/a \/new \\ | Bekerja dengan Jalur UNIX |
Sed 's/[a-g] // g' file.txt | Hapus semua karakter dari A ke G dari file.txt |
sed 's/\ (.*\) foo/\ 1bar/'file.txt | Ganti hanya pertandingan terakhir FOO dengan bar |
sed '1!G; h; $!D' | Penggantian TAC |
sed '/\ n/!G; s/\ (.\) \ (.*\ n \)/& \ 2 \ 1 \ | Penggantian putaran |
file sed 10q.txt | Pengganti kepala |
sed -e: a -e '$ q; n; 11, $ d; ba' \ | Pengganti ekor |
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D' \ | Penggantian Uniq |
sed '$!N; S/^\ (.*\) \ n \ 1 $/\ 1/; \ | Yang berlawanan (atau setara uniq -d) |
sed '$!N; $!D 'file.txt | Setara dengan ekor -n 2 |
file sed -n '$ p'.txt | … Ekor -n 1 (atau ekor -1) |
sed '/regexp/!D 'file.txt | GREP setara |
sed -n '/regexp/g; 1!p;; h 'file.txt | Cetak garis sebelum satu regexp yang cocok, tapi bukan yang berisi regexp |
Sed -n '/Regexp/n; p;' file.txt | Cetak garis setelah yang cocok dengan regexp, tapi bukan yang berisi regexp |
file sed '/pola/d'.txt | Hapus pola pencocokan garis |
SED '/./!D 'file.txt | Hapus semua baris kosong dari file |
Sed '/^$/n;/\ n $/n; // d' file.txt | Hapus semua baris kosong berturut -turut Kecuali dua yang pertama |
sed -n '/^$/p; h;;/./X;/./P;'\ | Hapus baris terakhir dari setiap paragraf |
Sed's/ S.\ x08 // G 'file | Hapus Nroff Overstrikes |
sed '/^$/q' | Dapatkan header surat |
sed '1,/^$/d' | Dapatkan badan surat |
Subjek Sed '/^: */!D; s ///; q ' | Dapatkan subjek surat |
sed 's/^/>/' | Mengutip pesan surat dengan memasukkan “>” Di depan setiap baris |
sed 's/^> //' | Yang sebaliknya (pesan surat tanpa kutipan) |
sed -e: a -e 's/]*> // g;/ | Hapus tag HTML |
SED '/./H; d;; x; s/\ n/= nl =/g '\ | Urutkan paragraf file.txt abjad |
Sed's@/usr/bin@&/local@g 'path.txt | Ganti/usr/bin with/usr/bin/lokal di jalur.txt |
sed 's@^.*$@<<>> jalur @g '.txt | Cobalah dan lihat 🙂 |
sed 's/\ (\/[^:]*\).*/\ 1/g 'jalur.txt | Jalur yang disediakan.txt berisi $ path, ini akan menggemakan hanya jalur pertama di setiap baris |
sed 's/\ ([^:]*\).*/\ 1/'/etc/passwd | Penggantian AWK - Hanya menampilkan pengguna dari file passwd |
echo "Selamat datang di barang geek" | sed \ | Cukup jelas |
sed -e '/^$/,/^end/s/hills/\ | Tukar 'bukit' dengan 'gunung', tetapi hanya di blok Teks Awal dengan garis kosong, dan diakhiri dengan garis awal dengan tiga karakter 'akhir', inklusif |
sed -e '/^#/d'/etc/layanan | lagi | Lihat file layanan tanpa baris yang dikomentari |
sed '$ s@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\ | Urutan terbalik item di jalur terakhir jalur.txt |
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\ | Cetak 1 baris konteks sebelum dan sesudah pencocokan garis, dengan nomor baris di mana pencocokan terjadi |
Sed '/regex/x; p; x;' file.txt | Masukkan baris baru di atas setiap line yang cocok Regex |
sed '/aaa/!D; /BBB/!D; /CCC/!D 'file.txt | Cocokkan AAA, BBB dan CCC dalam urutan apa pun |
sed '/aaa.*BBB.*CCC/!D 'file.txt | Cocokkan AAA, BBB dan CCC dalam urutan itu |
sed -n '/^.\ 65 \/p 'file.txt | Cetak garis 65 chars panjang atau lebih |
sed -n '/^.\ 65 \/!file p '.txt | Cetak garis 65 chars lama atau kurang |
file sed '/regex/g'.txt | Masukkan garis kosong di bawah setiap baris |
Sed '/regex/x; p; x; g;' file.txt | Masukkan garis kosong di atas dan di bawah |
Sed = file.txt | sed 'n; s/\ n/\ t/' | Baris nomor dalam file.txt |
Sed -e: a -e 's/^.\ 1,78 \ $/\ | Sejajarkan teks flush kanan |
Sed -e: a -e 's/^.\ 1,77 \ $/ &/; ta '-e \ | Sejajarkan Pusat Teks |
Kesimpulan
Ini hanya bagian dari apa yang dapat diceritakan tentang SED, tetapi seri ini dimaksudkan sebagai panduan praktis, jadi kami berharap ini membantu Anda menemukan kekuatan alat Unix dan menjadi lebih efisien dalam pekerjaan Anda.
Tutorial Linux Terkait:
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
- Hal -hal yang harus diinstal pada Ubuntu 22.04
- Dengarkan stasiun radio favorit Anda dengan satu perintah…
- Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
- Ubuntu 20.04 Panduan
- Menguasai loop skrip bash