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 sed
laporan 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 sed
halaman 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
sed
membaca input dari file yang disimpan dalam sistem file jika nama file ditentukan dalam argumen baris perintah selama pemanggilannya, atau dari stdin
jika 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!
sed
secara 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 p
atau d
ditentukan *, sed
akan 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 sed
bersama dengan -n
switch:
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
, d
dan s
perintah, yang merupakan perintah yang tercakup dalam jawaban ini.
Pemilihan garis
sed
dapat 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 sed
bersama dengan -n
saklar 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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
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 s
perintahnya 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 s
perintah; 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 sed
urutan -spesifik dengan makna khusus; <pattern_flags>
adalah daftar flag yang memodifikasi perilaku <pattern>
.
Paling umum sed
urutan-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 -n
sakelar sed
untuk 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
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.