Untuk apa sed dan untuk apa?

20

Saya telah melihat banyak sedakhir - akhir ini, dan saya merasa itu menjadi perintah yang agak membingungkan. Halaman manual tidak terlalu membantu, tapi saya tahu itu bisa digunakan untuk mem-parsing output dari perintah lain.

Apa sebenarnya seddan apa gunanya? Saya mencari jawaban komprehensif yang mencakup apa sed, apa yang biasa digunakan, dan beberapa contoh dasar / sintaksis.

Seth
sumber
3
Dari halaman manual Sed:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89
Ini harus menjadi tempat yang baik untuk memulai jawaban yang komprehensif: en.wikipedia.org/wiki/Sed
saji89
1
info sedmemiliki lebih banyak daripada man sed. Lalu, di, di /usr/share/doc/sedsana sedfaq.txt.gz.

Jawaban:

20

Dalam penggunaan dasar, kata ini digunakan untuk 'mencari dan mengganti' dengan string.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

kembali

"The quick brown fox jumps over the lazy cat"

Sed benar-benar bersinar ketika ekspresi reguler digunakan dengannya.

Anda mungkin ingin melihat pada artikel ini sekitar sed, yang cukup komprehensif.

pendiam
sumber
5

Definisi

Unix System V: panduan praktis , buku oleh Mark Sobell:

Utilitas sed adalah editor batch (noninteractive). Perintah sed biasanya disimpan dalam file skrip. . Meskipun Anda dapat memberikan perintah sed sederhana dari baris perintah. . .

Halaman manual untuk sed (GNU sed) 4.2.2:

Sed adalah editor aliran. Editor aliran digunakan untuk melakukan transformasi teks dasar pada aliran input (file atau input dari pipa).

Definisi informal saya:

Sed(singkatan editor aliran ) adalah utilitas pemrosesan teks yang telah dikembangkan pada saat teks diproses satu baris pada satu waktu, tetapi tetap menjadi salah satu utilitas Unix / Linux yang paling kuat; pada saat yang sama, itu adalah bentuk bahasa scripting, yang dirancang khusus untuk memproses teks.

Penggunaan

Seperti yang disarankan oleh definisi, seddigunakan untuk memproses baris teks, file teks, dan aliran teks yang disalurkan. Paling sering digunakan untuk mengganti serta menghapus teks:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Namun, ini juga dapat digunakan untuk meniru perilaku perintah lain. Misalnya,

  • untuk meniru dmesg | head -n 3(mencetak 3 baris pertama), bisa kita lakukan dmesg | sed -n 1,3p.
  • untuk meniru dmesg | grep 'wlan0'(mencari string), bisa kita lakukandmesg | sed -n '/wlan0/p'
  • Daftar barang

Keuntungan besar yang sedada di atas utilitas pemrosesan teks lainnya adalah -iflag, artinya kita tidak bisa hanya menampilkan teks yang diedit ke layar, tetapi sebenarnya menyimpan hasil edit ke file asli. awkrasa, sebaliknya, hanya memiliki fitur seperti itu dalam GNU awkversi.

seddapat mengambil input pada baris perintah, dengan beberapa pola dipisahkan oleh tanda titik koma ( ;) atau dari file skrip yang ditentukan setelah -fflag, misalnyacat someTextfile.txt | sed -f myScript.sed

Aplikasi dan contoh sed

Sergiy Kolodyazhnyy
sumber
1

Jawaban ini adalah pekerjaan yang sedang berjalan - ia kehilangan lebih banyak contoh tentang perintah susbstitute


Apa sed?

sed = Streaming Editor

Deskripsi di halaman manual untuk sedlaporan GNU 4.2.2:

Sed adalah editor aliran. Editor aliran digunakan untuk melakukan transformasi teks dasar pada aliran input (file atau input dari pipa). Sementara dalam beberapa hal mirip dengan editor yang memungkinkan pengeditan skrip (seperti ed), juga berfungsi dengan hanya membuat satu melewati input (s), dan karenanya lebih efisien. Tetapi itu adalah kemampuan sed untuk menyaring teks dalam pipa yang secara khusus membedakannya dari jenis editor lainnya.

Decription di GNU sedhalaman di gnu.org laporan:

sed (editor arus) bukan editor teks interaktif. Alih-alih, ini digunakan untuk memfilter teks, yaitu, mengambil input teks, melakukan beberapa operasi (atau serangkaian operasi) di atasnya, dan menampilkan teks yang dimodifikasi. sed biasanya digunakan untuk mengekstraksi bagian dari file menggunakan pencocokan pola atau mengganti beberapa kemunculan string dalam file.

Untuk apa sed?

Ini dapat digunakan untuk melakukan modifikasi kompleks pada aliran data (biasanya teks, tetapi dapat juga digunakan untuk memodifikasi data biner).

Di antara kasus-kasus penggunaan yang paling umum ada:

  • Mencetak / menghapus baris secara selektif dari file teks menggunakan ekspresi reguler dasar / luas
  • Secara global mengganti string dalam file teks menggunakan ekspresi reguler dasar / luas
  • Mengganti string dalam file teks secara selektif menggunakan ekspresi reguler dasar / luas

Ini adalah kasus penggunaan yang tercakup dalam jawaban ini.

Pemakaian

sedmembaca input dari file yang disimpan dalam sistem file jika nama file ditentukan dalam argumen baris perintah selama pemanggilannya, atau dari stdinjika tidak ada nama file yang ditentukan.

Doa minimal menggunakan file yang disimpan dalam sistem file:

sed '' file

Doa minimal menggunakan stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Halo Dunia!

sedsecara default membaca file input baris demi baris; ia membaca satu baris, menghilangkan baris baru yang tertinggal dari garis dan menempatkan baris yang diproses ke dalam "ruang pola"; akhirnya, ia mengeksekusi perintah yang terdaftar pada konten saat ini dari ruang pola dan membaca baris baru dari file input.

Ketika tidak ada perintah yang ditentukan atau ketika perintah patau dditentukan *, sedakan selalu mencetak konten saat ini dari ruang pola diikuti oleh baris baru di setiap iterasi terlepas dari:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Untuk mencegah satu ini mungkin memanggil sedbersama dengan -nswitch:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Berbicara hanya untuk p, ddan sperintah, yang merupakan perintah yang tercakup dalam jawaban ini.

Pemilihan garis

seddapat memproses seluruh file input atau hanya memproses baris yang dipilih dari file input; pemilihan baris file input yang akan diproses dilakukan dengan menentukan "alamat"; alamat dapat berupa (antara lain) nomor baris atau pola; rentang garis dapat dipilih dengan menentukan rentang alamat.

Kemungkinan kombinasi alamat adalah:

  • <N>(Di mana <N>ada nomor): perintah / perintah berikut akan dieksekusi hanya pada nomor baris <N>;
  • <N>,<M>(di mana <N>dan <M>dua angka, <N>> <M>): perintah / perintah berikut akan dieksekusi pada garis mulai dari nomor <N>baris ke nomor baris <M>inklusif;
  • /<pattern>/(di mana <pattern>ekspresi reguler dasar atau diperluas): perintah / perintah berikut akan dieksekusi hanya pada baris yang berisi kejadian <pattern>;
  • /<pattern1>/,/<pattern2>/(di mana <pattern1>dan <pattern2>merupakan ekspresi reguler dasar atau diperluas): perintah / perintah berikut ini akan dieksekusi pada baris mulai dari baris pertama yang berisi kemunculan <pattern1>hingga baris berikutnya yang mengandung kemunculan <pattern2>, berkali-kali dalam kasus beberapa keteraturan <pattern1>- <pattern2>kejadian;
  • <N>,/pattern/(di mana <N>angka dan <pattern>ekspresi reguler dasar atau diperluas): perintah / perintah berikut akan dieksekusi pada baris mulai dari nomor baris <N>ke baris pertama yang berisi kemunculan <pattern>;
  • /pattern/,<N>(di mana <pattern>ekspresi reguler dasar atau diperluas dan <N>angka): perintah / perintah berikut akan dieksekusi pada baris mulai dari baris pertama yang berisi kemunculan <pattern>ke nomor baris <N>;

Seleksi yang dilakukan untuk mencetak, menghapus, atau melakukan pergantian pada rentang garis akan selalu menyertakan garis yang cocok dengan alamat yang ditentukan; lebih jauh lagi, pemilihan dilakukan untuk mencetak, menghapus atau melakukan penggantian pada rentang garis menggunakan pola yang malas dan global (yaitu, setiap rentang yang terkena dampak akan selalu menjadi yang terkecil mungkin, dan beberapa rentang akan terpengaruh).

Ketika mencetak rentang garis atau pencetakan hanya garis yang substitusi telah dilakukan, itu perlu untuk memohon sedbersama dengan -nsaklar untuk mencegah garis-garis yang cocok criterium yang akan dicetak dua kali (ini terjadi hanya saat mencetak rentang garis) dan dalam rangka untuk mencegah garis yang tidak cocok dengan kriteria yang akan dicetak.

Pilihan baris yang akan diproses harus diikuti oleh perintah atau dengan beberapa perintah yang dipisahkan dengan tanda koma yang dikelompokkan menggunakan kurung kurawal.

Perintah: cetak, hapus

Perintah yang digunakan untuk mencetak atau menghapus pilihan adalah, masing-masing:

  • p: mencetak garis yang cocok dengan alamat / rentang alamat yang ditentukan;
  • d: menghapus baris yang cocok dengan alamat / rentang alamat yang ditentukan;

Ketika salah satu dari perintah ini tidak didahului oleh alamat / pilihan, perintah dijalankan secara global, yaitu pada setiap baris file input.

Contoh: cetak, hapus

Mencetak / menghapus garis yang menentukan alamat numerik:

File sampel:

line1
line2
line3
line4
line5
  • Garis pencetakan <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Menghapus garis <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Garis pencetakan <N>ke <M>inklusif:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Menghapus garis <N>ke <M>inklusif:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Mencetak / menghapus garis yang menentukan pola:

File sampel:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Garis pencetakan yang cocok <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Menghapus pencocokan garis <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Mencetak garis dari garis yang cocok <pattern1>ke garis yang cocok <pattern2>termasuk:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Menghapus garis dari garis yang cocok <pattern1>ke garis yang cocok <pattern2>termasuk:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Perintah: pengganti

Perintah yang digunakan untuk melakukan substitusi pada suatu seleksi adalah:

  • s: baris pengganti yang cocok dengan alamat / rentang alamat yang ditentukan;

Ketika perintah ini tidak diawali oleh suatu alamat / pemilihan, perintah dieksekusi secara global, yaitu pada setiap baris dari file input.

Sintaks sperintahnya adalah:

s/<pattern>/<replacement_string>/<pattern_flags>

Garis miring adalah "pembatas"; mereka digunakan untuk membatasi <pattern>, <replacement_string>dan <pattern_flags>bagian;

Pembatas selalu karakter segera mengikuti sperintah; itu dapat diatur ke karakter lain, misalnya |,:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>adalah ekspresi reguler dasar atau diperluas; <replacement_string>adalah string tetap yang dapat menyertakan sedurutan -spesifik dengan makna khusus; <pattern_flags>adalah daftar flag yang memodifikasi perilaku <pattern>.

Paling umum sedurutan-spesifik dengan makna khusus:

  • &: backreference diganti dengan string yang cocok dengan <pattern>;
  • \<N>(Di mana <N>nomornya): referensi kembali diganti dengan <N>grup yang ditangkap <pattern>;

Bendera yang paling umum:

  • g: kekuatan <pattern>untuk mencocokkan secara global, yaitu beberapa kali di setiap baris;
  • i: kekuatan <pattern>untuk mencocokkan case-insensitive;
  • p: mencetak baris tempat penggantian dilakukan sekali lagi (berguna saat menggunakan doa -nsakelar seduntuk hanya mencetak baris tempat penggantian dilakukan);

Contoh: pengganti

File sampel:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Mengganti kejadian pertama <pattern>dengan <replacement_string>pada setiap baris:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Mengganti semua kemunculan <pattern>dengan <replacement_string>pada setiap baris:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Memilih hanya garis yang dimulai dengan <pattern1>dan mengganti semua kejadian <pattern2>dengan <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Memilih hanya baris yang diakhiri dengan <pattern1>dan mengganti semua kejadian <pattern2>dengan <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
kos
sumber