Pengenalan

Pengenalan

Selamat datang ke bahagian kedua siri kami, bahagian yang akan memberi tumpuan kepada SED, versi GNU. Seperti yang anda lihat, terdapat beberapa varian SED, yang tersedia untuk beberapa platform, tetapi kami akan memberi tumpuan kepada versi GNU Sed 4.x. Ramai di antara anda sudah mendengar tentang sed dan sudah menggunakannya, terutamanya sebagai alat penggantian. Tetapi itu hanyalah segmen apa yang boleh dilakukan oleh sed, dan kami akan melakukan yang terbaik untuk menunjukkan kepada anda sebanyak mungkin apa yang boleh anda lakukan dengannya. Nama ini bermaksud Editor Stream, dan di sini "Stream" boleh menjadi fail, paip atau hanya stdin. Kami mengharapkan anda mempunyai pengetahuan asas Linux dan jika anda sudah bekerja dengan ungkapan biasa atau sekurang -kurangnya tahu apa yang regexp, semakin baik. Kami tidak mempunyai ruang untuk tutorial penuh mengenai ungkapan biasa, jadi sebaliknya kami hanya akan memberi anda idea asas dan banyak contoh SED. Terdapat banyak dokumen yang berurusan dengan subjek, dan kami juga akan mempunyai beberapa cadangan, seperti yang anda lihat dalam satu minit.

Pemasangan

Tidak banyak yang boleh diberitahu di sini, kerana kemungkinan anda telah memasang SED, kerana ia digunakan dalam pelbagai skrip sistem dan alat yang tidak ternilai dalam kehidupan pengguna Linux yang ingin menjadi cekap. Anda boleh menguji versi apa yang anda ada dengan menaip

 $ sed -version

Pada sistem saya, arahan ini memberitahu saya bahawa saya mempunyai gnu sed 4.2.1 dipasang, ditambah pautan ke halaman rumah dan barangan berguna lain. Pakej ini dinamakan hanya 'sed' tanpa mengira pengedaran, tetapi jika gentoo menawarkan sed secara tersirat, saya percaya itu bermakna anda boleh yakin.

Konsep

Sebelum kita pergi lebih jauh, kita rasa penting untuk menunjukkan apa Tepat sekali bahawa SED tidak, kerana "editor aliran" mungkin tidak terlalu banyak loceng. SED mengambil teks input, adakah operasi yang ditentukan pada setiap baris (kecuali dinyatakan sebaliknya) dan mencetak teks yang diubah suai. Operasi yang ditentukan boleh ditambah, masukkan, memadam atau menggantikannya. Ini tidak semudah yang dapat dilihat: diperingatkan bahawa terdapat banyak pilihan dan kombinasi yang dapat membuat perintah sed agak sukar untuk dicerna. Oleh itu, jika anda ingin menggunakan SED, kami mengesyorkan anda mempelajari asas -asas regexps, dan anda boleh menangkap selebihnya semasa anda pergi. Sebelum kita memulakan tutorial, kami ingin mengucapkan terima kasih.



Ungkapan biasa

Oleh kerana perintah/skrip sed cenderung menjadi misteri, kita merasakan bahawa pembaca kita mesti memahami konsep asas dan bukannya menyalin dan menyisipkan perintah yang mereka tidak tahu maksudnya. Apabila seseorang ingin memahami apa itu regexp, kata kunci adalah "sepadan". Atau lebih baik, "padanan corak". Contohnya, dalam laporan untuk jabatan HR anda, anda menulis nama Nick ketika merujuk kepada arkitek rangkaian. Tetapi Nick berpindah dan John datang untuk mengambil tempatnya, jadi sekarang anda perlu menggantikan perkataan Nick dengan John. Sekiranya fail dipanggil laporan.txt, anda boleh buat

 laporan $ kucing.txt | sed's/nick/john/g '> Report_new.txt

Secara lalai SED menggunakan stdout, jadi anda mungkin mahu menggunakan pengendali redirect shell anda, seperti dalam contoh kami di bawah. Ini adalah contoh yang paling mudah, tetapi kami menggambarkan beberapa mata: kami sepadan dengan corak "Nick" dan kami menggantikan semua contoh dengan "John". Perhatikan bahawa SED adalah sensitif kes, jadi berhati-hati dan periksa fail output anda untuk melihat sama ada semua penggantian dibuat. Di atas boleh ditulis juga seperti ini:

 laporan $ sed 's/nick/john/g'.txt> Report_new.txt

Ok, tetapi di mana ungkapan biasa, anda bertanya? Nah, kami mula -mula ingin mendapatkan kaki anda basah dengan konsep padanan dan di sini datang bahagian yang menarik.

Jika anda tidak pasti jika anda menulis "Nick" secara tidak sengaja dan bukannya "Nick" dan mahu memadankannya juga, anda boleh menggunakan sed 's/nick | Nick/John/G'. Bar menegak mempunyai makna yang sama yang mungkin anda ketahui jika anda menggunakan c, iaitu, ungkapan anda akan sesuai dengan nick atau Nick. Seperti yang anda lihat, paip boleh digunakan dengan cara lain juga, tetapi makna 'akan kekal. Pengendali lain yang digunakan secara meluas dalam regexps adalah '?', yang sepadan dengan sifar atau satu contoh elemen sebelumnya (flavou?r akan memadankan rasa dan rasa), '*' bermaksud sifar atau lebih dan '+' sepadan dengan satu atau lebih elemen. '^' sepadan dengan permulaan rentetan, sementara '$' tidak sebaliknya. Sekiranya anda pengguna VI (m), beberapa perkara ini mungkin kelihatan biasa. Lagipun, utiliti ini, bersama -sama dengan AWK atau C mempunyai akarnya pada hari -hari awal Unix. Kami tidak akan menegaskan lagi mengenai subjek, kerana perkara akan menjadi lebih mudah dengan membaca contoh, tetapi apa yang anda perlu tahu ialah terdapat pelbagai pelaksanaan regexps: POSIX, POSIX Extended, Perl atau pelbagai pelaksanaan ekspresi biasa kabur, dijamin memberi Anda sakit kepala.



contoh sed

Pembelajaran Linux sed dengan contoh
Sintaks perintah linux Penerangan arahan Linux
Laporan Sed 'S/Nick/John/G'.txt
Gantikan setiap kejadian Nick dengan John dalam laporan.txt
Laporan Sed 'S/Nick | Nick/John/G'.txt
Ganti setiap kejadian Nick atau Nick dengan John.
fail sed 's/^//'.txt> file_new.txt
Tambahkan 8 ruang di sebelah kiri teks untuk percetakan cantik.
sed -n '/tentu saja/,/perhatian anda \
bayar/p 'myfile

Paparkan hanya satu perenggan, bermula dengan "tentu saja"

dan berakhir dengan "Perhatian yang anda bayar"

Sed -n 12,18p fail.txt
Tunjukkan hanya baris 12-18 fail.txt
SED 12,18D fail.txt
Tunjukkan semua fail.TXT kecuali garis 12 hingga 18
Fail sed G.txt 
Fail dua ruang.txt
skrip sed -f.fail sed.txt
Tulis semua arahan dalam skrip.sed dan laksanakannya
sed '5!s/ham/keju/'fail.txt
Ganti ham dengan keju dalam fail.txt kecuali di baris ke -5
fail sed '$ d'.txt
Padamkan baris terakhir
sed '/[0-9] \ 3 \/p' fail.txt
Cetak hanya baris dengan tiga digit berturut -turut
sed '/boom/!fail s/aaa/bb/'.txt
Kecuali Boom dijumpai menggantikan AAA dengan BB
fail sed '17,/cakera/d '.txt
Padamkan semua baris dari baris 17 hingga 'cakera'
echo one two | sed "s/one/unos/i"

Menggantikannya dengan Unos dengan cara yang tidak sensitif,

jadi ia akan mencetak "unos two"

fail sed 'g; g'.txt
Triple-Space Fail
sed 's/.$ // 'fail.txt
Cara untuk menggantikan dos2unix 🙂
fail sed 's/ ^[ ^t]*//'.txt
Padam semua ruang di hadapan setiap baris fail.txt
fail sed 's/[ ^t]*$ //'.txt
Padamkan semua ruang pada akhir setiap baris fail.txt
sed 's/ ^[ ^t]*//; s/[ ^]*$ //' fail.txt

Padamkan semua ruang di depan dan pada akhir setiap baris

fail.txt

fail sed 's/foo/bar/'.txt
Ganti Foo dengan bar hanya untuk contoh pertama dalam satu baris.
fail sed 's/foo/bar/4'.txt
Ganti Foo dengan bar hanya untuk contoh ke -4 dalam satu baris.
fail sed 's/foo/bar/g'.txt 
Ganti Foo dengan bar untuk semua keadaan dalam satu baris.
fail sed '/baz/s/foo/bar/g'.txt
Hanya jika garis mengandungi baz, pengganti foo dengan bar
sed '/./,/^$/!d 'fail.txt
Padam semua baris kosong berturut -turut kecuali EOF
fail sed '/^$/n;/\ n $/d'.txt

Padam semua baris kosong berturut -turut, tetapi membenarkan

Hanya garis kosong atas

sed '/./, $!d 'fail.txt
Padam semua baris kosong terkemuka
sed -e: a -e '/^\ n*$/$ d; n;;/\ n $/ba' \
fail.txt
Padamkan semua garis kosong yang ketinggalan
sed -e: a -e '/\\ $/n; s/\\\ n //; ta '\
fail.txt

Sekiranya fail berakhir di backslash, sertai dengan yang seterusnya (berguna

untuk skrip shell)

sed '/regex/,+5/expr/'
Perlawanan regex ditambah 5 baris seterusnya
fail sed '1 ~ 3d'.txt
Padam setiap baris ketiga, bermula dengan yang pertama
fail sed -n '2 ~ 5p'.txt
Cetak setiap baris ke -5 bermula dengan yang kedua
Laporan Sed 'S/[NN] ick/John/G'.txt

Cara lain untuk menulis beberapa contoh di atas.

Bolehkah anda meneka yang mana?

fail sed -n '/re/p; q;'.txt

Cetak hanya perlawanan pertama

Re (ungkapan biasa)

fail sed '0,/re/// d;'.txt
Padam hanya perlawanan pertama
sed '0,/re/s // to_that/' fail.txt
Tukar hanya perlawanan pertama
sed 's/^[^,]*,/9999,/' fail.CSV
Tukar medan pertama ke 9999 dalam fail CSV
s/^ *\ (.*[^] \) *$/| \ 1 |/;
s/" *, */" |/g;
: gelung
s/| *\ ([^", |] [^, |] *\) *, */| \ 1 |/g;
s/| *, */| \ 1 |/g;
T Loop
s/ *|/|/g;
s/| */|/g;
s/^| \ ((.*\) | $/\ 1/;

Skrip sed untuk menukar fail CSV ke bar yang dipisahkan

(hanya berfungsi pada beberapa jenis CSV,

dengan tertanam "s dan koma)

sed ': a; s/\ (^\ | [^0-9.] \) \ ([0-9] \+\) \\
([0-9] \ 3 \ \)/\ 1 \ 2, \ 3/g; ta 'fail.txt
Tukar nombor dari fail.TXT dari 1234.56 Borang hingga 1.234.56
sed -r "s/\<(reg|exp)[a-z]+/\U&/g"
Tukar sebarang perkataan bermula dengan reg atau exp ke huruf besar
fail '1,20 s/johnson/putih/g'.txt

Adakah penggantian Johnson dengan putih sahaja

garis antara 1 dan 20

sed '1,20 !fail s/johnson/putih/g '.txt
Yang dibalikkan di atas (sepadan dengan semua kecuali baris 1-20)
sed '/dari/,/sehingga/s/\/magenta/g; \
s/\/cyan/g; 'fail.txt
Ganti hanya antara "dari" dan "sehingga"
sed '/endnotes:/, $ s/schaff/herzog/g; \
s/kraft/ebbing/g; 'fail.txt
Ganti hanya dari perkataan "endnotes:" sehingga eof
sed '/./H; $!d;; x;/regex/!d 'fail.txt
Cetak perenggan hanya jika mereka mengandungi regex
 sed -e '/./H; $!d; '-e' x;/re1/!d; \
/Re2/!d;/re3/!d 'fail.txt

Cetak perenggan hanya jika mereka mengandungi Re1,

RE2 dan RE3

 sed ': a; /\\ $/n; s/\\\ n //; Fail ta '.txt

Sertailah dua baris di hujung pertama di backslash

 Fail Sed's/14 "/Fourteen Inci/G '.txt

Inilah cara anda boleh menggunakan sebut harga berganda

 sed's/\/some \/unix \/path/\/a \/new \\
/PATH/G 'FILE.txt

Bekerja dengan Laluan Unix

 fail sed 's/a-g] // g'.txt

Keluarkan semua aksara dari A hingga G dari fail.txt

sed's/\ (.*\) foo/\ 1bar/'fail.txt
Ganti hanya perlawanan terakhir Foo dengan bar
sed '1!G; h; $!D ' 
Pengganti TAC
sed '/\ n/!G; s/\ (.\) \ (.*\ n \)/& \ 2 \ 1 \
/; // d; s/.// '
Pengganti rev
Fail 10q sed.txt
Pengganti kepala
sed -e: a -e '$ q; n; 11, $ d; ba' \
fail.txt
Penggantian ekor
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D '\
fail.txt
Penggantian uniq
sed '$!N; s/^\ (.*\) \ n \ 1 $/\ 1/; \
t; D 'fail.txt
Yang bertentangan (atau uniq -d setaraf)
sed '$!N; $!D 'fail.txt
Bersamaan dengan ekor -n 2
fail sed -n '$ p'.txt
... ekor -n 1 (atau ekor -1)
sed '/regexp/!d 'fail.txt
setara grep
sed -n '/regexp/g; 1!p;; h 'fail.txt

Cetak garisan sebelum regexp yang sepadan, tetapi

bukan yang mengandungi regexp

fail sed -n '/regexp/n; p;'.txt
Cetak garisan selepas yang sepadan dengan regexp, tetapi

bukan yang mengandungi regexp

fail sed '/corak/d'.txt
Padam corak sepadan garis
sed '/./!d 'fail.txt
Padamkan semua baris kosong dari fail
fail '/^$/n;/\ n $/n; // d'.txt

Padamkan semua baris kosong berturut -turut

Kecuali untuk dua yang pertama

sed -n '/^$/p; h;;/./x;/./p; '\
fail.txt
Padamkan baris terakhir setiap perenggan
sed 's/.\ x08 // g 'fail
Keluarkan NROFF OVERTRIKES
sed '/^$/q'
Dapatkan header mel
sed '1,/^$/d'
Dapatkan badan mel
sed '/^subjek: */!d; s ///; q '
Dapatkan subjek mel
sed 's/^/>/'

Petikan mesej mel dengan memasukkan a

">" Di hadapan setiap baris

sed 's/^> //'
Sebaliknya (mesej mel tidak menyuarakan)
sed -e: a -e 's/]*> // g;/ 
Keluarkan tag html
sed '/./H; d;; x; s/\ n/= nl =/g '\
fail.txt | sort \
| sed '1S/= nl = //; s/= nl =/\ n/g'
Susun perenggan fail.TXT mengikut abjad
Path Sed's@/usr/bin@&/local@g '.txt
Ganti/usr/bin dengan/usr/bin/tempatan di jalan.txt
sed's@^.*$@<<>> @g 'jalan.txt
Cubalah dan lihat 🙂
sed's/\ (\/[^:]*\).*/\ 1/g 'jalan.txt

Jalan yang disediakan.TXT mengandungi $ jalan, ini akan

echo hanya jalan pertama pada setiap baris

sed's/\ ([^:]*\).*/\ 1/'/etc/passwd

Penggantian Awk - Memaparkan hanya pengguna

dari fail passwd

echo "Selamat Datang ke Stuff Geek" | sed \
's/\ b [a-z] \)/\ (\ 1 \)/g'
(W) elcome (t) o (t) dia (g) eek (s) tuff
Diri jelas
sed -e '/^$/,/^end/s/Hills/\
fail gunung/g '.txt

Swap 'bukit' untuk 'gunung', tetapi hanya di blok

permulaan teks

dengan garis kosong, dan berakhir dengan garis permulaan

Dengan tiga watak 'akhir', inklusif

sed -e '/^#/d'/etc/Services | lebih
Lihat fail perkhidmatan tanpa baris yang dikomentari
sed '$ s@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\
\)@\ 3: \ 2: \ 1@g 'Path.txt
Urutan barangan terbalik di barisan terakhir.txt
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\
-e h fail.txt

Cetak 1 baris konteks sebelum dan selepas garis sepadan,

dengan nombor garis di mana padanan berlaku

fail '/regex/x; p; x;'.txt
Masukkan baris baru di atas setiap baris yang sepadan dengan regex
sed '/aaa/!d; /Bbb/!d; /Ccc/!d 'fail.txt
Padankan AAA, BBB dan CCC dalam apa -apa perintah
sed '/aaa.*Bbb.*Ccc/!d 'fail.txt
Padankan AAA, BBB dan CCC mengikut urutan itu
sed -n '/^.\ 65 \/p 'fail.txt
Cetak garis 65 chars panjang atau lebih
sed -n '/^.\ 65 \/!fail p '.txt
Garis cetak 65 chars panjang atau kurang
fail sed '/regex/g'.txt
Masukkan garis kosong di bawah setiap baris
Fail '/regex/x; p; x; g;' '.txt
Masukkan garis kosong di atas dan di bawah
sed = fail.txt | sed 'n; s/\ n/\ t/'
Baris nombor dalam fail.txt
sed -e: a -e 's/^.\ 1,78 \ $/\
&/; ta 'fail.txt
Align Text Flush Betul
sed -e: a -e 's/^.\ 1,77 \ $/ &//; ta '-e \
's/\ ( *\) \ 1/\ 1/' fail.txt
Menyelaraskan pusat teks

Kesimpulan

Ini hanya sebahagian daripada apa yang dapat diberitahu tentang SED, tetapi siri ini dimaksudkan sebagai panduan praktikal, jadi kami berharap ia dapat membantu anda menemui kekuatan alat unix dan menjadi lebih efisien dalam kerja anda.

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
  • Perkara yang perlu dipasang di Ubuntu 22.04
  • Dengarkan stesen radio kegemaran anda dengan satu arahan ..
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Ubuntu 20.04 Panduan
  • Menguasai Gelung Skrip Bash