Pengenalan
- 679
- 174
- Chris Little I
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 \ | 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' \ | Padamkan semua garis kosong yang ketinggalan |
sed -e: a -e '/\\ $/n; s/\\\ n //; ta '\ | 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 |/; | 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] \+\) \\ | 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; \ | Ganti hanya antara "dari" dan "sehingga" |
sed '/endnotes:/, $ s/schaff/herzog/g; \ | 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; \ | 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 \\ | 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 \ | Pengganti rev |
Fail 10q sed.txt | Pengganti kepala |
sed -e: a -e '$ q; n; 11, $ d; ba' \ | Penggantian ekor |
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D '\ | Penggantian uniq |
sed '$!N; s/^\ (.*\) \ n \ 1 $/\ 1/; \ | 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; '\ | 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 '\ | 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 \ | Diri jelas |
sed -e '/^$/,/^end/s/Hills/\ | 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@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\ | Urutan barangan terbalik di barisan terakhir.txt |
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\ | 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 \ $/\ | Align Text Flush Betul |
sed -e: a -e 's/^.\ 1,77 \ $/ &//; ta '-e \ | 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