Perkenalan

Perkenalan

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 \
bayar/p 'myfile

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' \
mengajukan.txt
Hapus semua garis kosong trailing
sed -e: a -e '/\\ $/n; s/\\ n //; ta '\
mengajukan.txt

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 |/;
s/" *, */" |/g;
: lingkaran
S/| *\ ([^", |] [^, |] *\) *, */| \ 1 |/g;
S/| *, */| \ 1 |/g;
L loop
S/ *|/|/g;
S/| */|/g;
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] \+\) \\
([0-9] \ 3 \ \)/\ 1 \ 2, \ 3/g; ta 'file.txt
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; \
s/\/cyan/g; file.txt
Ganti hanya antara "dari" dan "sampai"
sed '/endnotes:/, $ s/schaff/herzog/g; \
S/Kraft/Ebbing/G; file.txt
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;\
/Re2/!d;/re3/!D 'file.txt

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 \\
/path/g 'file.txt

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 \
/; // d; s/.// '
Penggantian putaran
file sed 10q.txt
Pengganti kepala
sed -e: a -e '$ q; n; 11, $ d; ba' \
mengajukan.txt
Pengganti ekor
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D' \
mengajukan.txt
Penggantian Uniq
sed '$!N; S/^\ (.*\) \ n \ 1 $/\ 1/; \
T; D 'file.txt
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;'\
mengajukan.txt
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 '\
mengajukan.txt | Sortir \
| sed '1s/= nl = //; s/= nl =/\ n/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 \
's/\ (\ b [a-z] \)/\ (\ 1 \)/g'
(W) elcome (t) o (t) he (g) eek (s) tuff
Cukup jelas
sed -e '/^$/,/^end/s/hills/\
file gunung/g.txt

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@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\
\)@\ 3: \ 2: \ 1@g 'path.txt
Urutan terbalik item di jalur terakhir jalur.txt
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\
-file e h.txt

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 \ $/\
&//; file ta.txt
Sejajarkan teks flush kanan
Sed -e: a -e 's/^.\ 1,77 \ $/ &/; ta '-e \
'S/\ ( *\) \ 1/\ 1/' file.txt
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