sed

Contoh Bash Sed

Contoh Bash Sed
Bash memungkinkan Anda melakukan penggantian pola menggunakan ekspansi variabel seperti ($var/pattern/replacement). Jadi, apakah sed seperti ini (sed -e 's/pattern/replacement/'). Namun, ada lebih dari sekadar mengganti pola dalam file teks.  Di sini kita akan menemukan kembali sed, dengan contoh, dengan perintah dan alur kerja yang setara untuk membantu tugas sehari-hari.

Setup untuk contoh sed

Berikut adalah panduan cepat untuk menyiapkan contoh, yang akan saya coba untuk tidak terlalu berlebihan.

"kata-kata" adalah file teks yang berisi angka 1 hingga 100. Jika Anda tidak yakin dengan perintah untuk membuatnya, lihat fungsi Ekspor untuk xargs di Bash Export Command. Anda tidak pernah tahu itu mungkin di wawancara skrip shell Anda berikutnya.

"bar" adalah file teks yang berisi satu baris -.

"php lama" adalah file teks yang berisi baris PHP lama yang akan rusak di php7 atau yang lebih baru or. (Petunjuk: ereg)

Perhatikan bahwa semua fungsi yang dijelaskan di atas dapat ditemukan di bawah di Catatan Akhir tentang fungsi untuk pengaturan.

Sed contoh dengan perintah yang setara equivalent

Dalam lingkungan baris perintah, Anda akan menemukan ada lebih dari satu solusi untuk tugas yang diberikan. Namun, sebagian besar, Anda ingin menempuh jalan yang menghasilkan resistensi paling sedikit. Berikut adalah daftar contoh perintah sed dengan perintah setara yang sesuai, di mana beberapa akan dibahas secara rinci di bawah ini:.

1. Cetak garis acak (setara dengan sort -R - | head -1)

sed -n "$(( RANDOM % 100 ))p" -

2.Cetak baris terakhir dalam file (setara dengan kepala -1 -)

sed -n '$p' -

3. Cetak 10 baris pertama dalam file (setara dengan head -n 10 -)

sed '10q' -

4. Cetak baris pertama dalam file (setara dengan tail -1 -)

sed -n '1p' -

5. Hapus semua instance karakter (setara dengan tr -delete '0' -, di mana 0 adalah karakter yang ingin kita hapus)

sed -e 's/0//g' -

6. Konversikan file csv ke tsv (setara dengan tr ',"\t' -)

sed -e 's/,/\t/g' -

7.Tambahkan baris ke file (setara dengan cat bar -)

sed '$a ---' -

8. Tambahkan baris ke file (setara dengan cat - bar)

sed '1i ---' -

9. Cetak semua baris dalam file (setara dengan cat -)

sed -n -e 'p' -

10. Cetak garis yang cocok dengan pola (setara dengan grep -e '^1' -)

sed -n -e '/^1/ p' -

11. Hapus garis yang cocok dengan pola (setara dengan grep -v -e '^1' -)

sed -e '/^1/ d' -

12. Dapatkan jumlah baris dalam file (setara dengan wc -l -)

sed -n -e '$=' -

13. Menulis ke file di latar belakang (tee perintah yang setara)

sed "w $1" -

Contoh menggunakan sed untuk mengimplementasikan perintah tee

Tepat di atas, ada contoh berlabel Tulis ke file di latar belakang. Kedengarannya seperti perintah tee. Yah, itu. Di sini kita akan memperluas tentang cara mengimplementasikan fungsi untuk mengganti tee di bash menggunakan sed.

Perintah

kaos kaki ()

uji $# -persamaan 1 || kembali;
sed "w $1" -

utama ()

barisan 10 | tee sepuluh;
kucing sepuluh

utama

Keluaran

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Di sini Anda akan melihat dua daftar bilangan bulat dari 1 hingga 10. Yang pertama adalah dari perintah seq. Yang kedua kami dapatkan dari kucing file yang ditulis dalam tee. Saya tahu ini konyol tetapi berhasil!

Contoh menggunakan sed untuk mencetak baris acak dalam file

Misalkan kita ingin mencetak baris acak dalam file menggunakan bash dan sedikit sed. Bisakah kita melakukannya?? Ya kita bisa! Begini caranya.

Menerapkan fungsi yang

  1. Mendapatkan jumlah baris dalam file, L
  2. Menghasilkan angka acak antara 1 dan L, R
  3. Mencetak R

Fungsi mengharapkan input disalurkan dari luar.

Perintah

beberapa baris ()

fungsi lc()

sed -n -e '$=' -
;
fungsi garis cetak ()

sed -n -e "$1p" -
;
suhu=$(mktemp );
kucing - > $temp;
kucing $temp | print-line $(( RANDOM % $( cat $temp | lc ) + 1 ));
rm $temp

Contoh penggunaan (1)

barisan 100 | _

Keluaran (1)

35

Contoh penggunaan (2)

curl https://linuxhint.com/bash_cut_command/ --silent | strip-tag | beberapa baris

Lihat contoh di bawah ini, menggunakan sed untuk menghapus tag HTML. Perhatikan bahwa contoh di atas terkadang mengembalikan kosong untuk baris kosong. Sebagai latihan, itu dapat ditingkatkan.

Menggunakan sed untuk mencetak baris dalam file

Misalkan Anda ingin mengimplementasikan fungsi di bash untuk mencetak baris yang diberikan dalam file. Mencoba mencetak satu baris dalam file menggunakan loop di bash, head, tail, atau awk terlalu banyak pekerjaan untuk mencetak baris dalam file. Untung kita punya sed. Fungsi yang dihasilkan menggunakan sed adalah sebagai berikut.

Perintah

garis cetak ()

sed -n "$1p" -

Sekarang mari kita lihat apa yang terjadi ketika kita menggunakan garis cetak pada kata-kata.

Perintah

kata-kata | garis cetak 50

Keluaran

50

baik. Terlihat bagus tapi mari kita coba sesuatu yang terlihat tidak terlalu sepele.

Perintah

nyatakan kata -xf
deklarasikan -xf print-line
seq 1 10 $( kata | wc -l ) | xargs -i  bash -c "words | print-line "

Keluaran

1
11
21
31
41
51
61
71
81
91

baik. Sekarang lebih seperti itu! Anda melihat bagaimana sed dapat digunakan dalam skrip bash untuk mencetak baris apa pun dalam file.

Contoh sed tanpa perintah yang setara

Dalam lingkungan baris perintah, terkadang jalan menuju solusi yang menghasilkan resistensi paling sedikit adalah cara sed; jika tidak, Anda akhirnya melakukan lebih banyak pekerjaan daripada yang dibutuhkan di tempat pertama. Beberapa perintah mungkin ditampilkan di bawah ini.

Perintahkan semua baris dalam skrip shell

sed -e 's/^/#/' -
Hapus baris pertama
sed -e '1d' -
Hapus baris terakhir
sed -e '$ d' -
Sisipkan garis sebelum garis yang cocok dengan pola
sed '/0$/i ---' -
Sisipkan baris demi baris yang cocok dengan pola
sed '/0$/ ---' -
Hapus tag html
sed -e 's/<[^>]*.//g' -
Tingkatkan ereg dalam kode php lama untuk dijalankan di php7 atau yang lebih baru
sed 's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Periksa apakah sed lebih awal dari versi tertentu
sed -e 'v 4.5' -

Contoh versi sed bercabang di bash

Di atas dalam contoh, ada baris untuk Memeriksa apakah sed lebih awal dari versi tertentu yang dapat kita gunakan untuk mengimplementasikan percabangan versi di bash, yang menurut saya lebih mudah daripada mencoba mengimplementasikan fungsi untuk membandingkan nomor versi dari sed -versi keluaran. Satu-satunya perangkap adalah jika ada versi sed sebelumnya yang tidak mendukung perintah v, maka kita berada dalam masalah.

Perintah

uji-sed-versi-paling()
gema -n | sed "v $1" - 2>/dev/null

versi percobaan ()

echo -n "Versi $1. baik. Lakukan ";
test-sed-version-at-most $1 &&
echo -n "lama";
benar
||
echo -n "baru"
;
gema "cara."

utama ()

v lokal;
untuk v dalam 4.4,5;
melakukan
versi-coba $v;
selesai

utama

Keluaran

Versi 4.4. baik. Lakukan dengan cara lama.
Versi 4.5. baik. Lakukan dengan cara baru.

Perhatikan bahwa versi sed yang berjalan di mesin saya saat mengetik karakter ini adalah 4.4, yang akan menjelaskan output di atas. Juga, pada saat yang sama, versi terbaru dari gnu sed adalah 4.7, sekitar 3 tahun lebih tua dari yang saya miliki. Sed saya sudah tua! Bahkan, di sed 4.0.6, parameter telah ditambahkan ke perintah versi sehingga strategi ini berfungsi untuk setidaknya v4.0.6, yang ringan mengingat versi itu dirilis pada awal 2003. Kamu baik.

Saya melakukan penggalian ekstra, sebenarnya NEWS membaca dari kode sumber terbaru. Versi 4.6 memiliki fitur baru, -debug yang membuang skrip dan memberi anotasi pada baris keluaran. Ini akan memungkinkan Anda untuk menerjemahkan skrip sed yang dihasilkan oleh fungsi dalam bash ke bentuk kanonik. Keren! Hanya saja, jangan lupa bahwa Anda memerlukan percabangan versi sed di bash. Di situlah contoh sed ini berperan.

Contoh fungsi bash menggunakan sed untuk menghapus tag HTML

Dalam contoh di atas ada baris untuk menghapus tag HTML. Mari kita lemparkan itu ke fungsi bash dan gunakan untuk menghapus semua tag HTML dari artikel terakhir yang saya tulis.

Perintah

strip-tag ()

sed -e 's/<[^>]*.//g' -

curl https://linuxhint.com/bash_cut_command/ --silent | strip-tag

Saya tidak bisa mengatakan itu sempurna tapi setidaknya bisa dibaca di terminal.

Contoh sed dengan alur kerja: Contoh alur kerja: ganti semua dengan aman menggunakan find, grep, dan sed

Aman untuk mengatakan bahwa perubahan yang dibuat menggunakan sed dengan opsi -i tidak dapat diubah. Itu kecuali jika Anda benar-benar yakin teks apa yang akan diganti, kemungkinan Anda akan berakhir dengan satu karakter lebih sedikit dari yang dimaksudkan. Itulah mengapa dalam contoh ini, kami akan menggunakan sed dalam alur kerja untuk mengganti teks dengan aman di semua file yang telah Anda pilih.

alur kerja

  1. Temukan
  2. grep
  3. sed
Temukan

Di sini Anda akan memilih file yang akan diganti. Saya sarankan menggunakan perintah di sepanjang baris ini:

temukan -tipe f -nama | grep -v -e | xargs -i …

Misalnya, Anda mungkin ingin membatasi file untuk mengganti file PHP tidak termasuk direktori repositori git sebagai berikut:.

temukan -tipe f -nama \*.php | grep -v -e '.git' | xargs -aku…

Baca lebih lanjut tentang perintah xargs di bash.

grep

Selanjutnya, kita akan mencoba dan mencocokkan some_pattern dalam file yang dipilih sebagai berikut. Perhatikan bahwa karena kita menggunakan opsi -o untuk grep, output hanya akan menampilkan string yang cocok jika ada.

temukan -tipe f -nama \*.php | grep -v -e '.git' |
xargs -i grep -e some_pattern -o

Perintah di atas akan mengembalikan daftar string yang cocok dengan some_pattern.

sed

Akhirnya, kami ingin mengganti semua string yang cocok dengan some_pattern. Untuk melakukan itu kita perlu mengubah grep menjadi sed sebagai berikut as.

temukan -tipe f -nama \*.php | grep -v -e '.git' |
xargs -i sed -i -e s/some_pattern/replacement/g

Perintah grep menjadi sed -i dan opsi -o dihapus. Dan di sana Anda memilikinya.

Sekarang Anda dapat memeriksa string apa yang akan diganti di sed terlebih dahulu alih-alih menguji keberuntungan Anda.

Catatan akhir tentang opsi yang digunakan dalam contoh

Berikut adalah daftar opsi yang digunakan dalam contoh sed yang dibahas secara singkat.

Pilihan Deskripsi
-saya Edit di tempat. Jika inputnya adalah file (tidak disalurkan) hasil ekspresi akan menimpa konten file.

Sed menerima satu

misalnya) sed -n…

-e -e singkatan dari ekspresi. Parameternya adalah ekspresi dalam bahasa sed.

Sed menerima banyak

misalnya) sed -e 'expr1' -e 'expr2'…

-tidak Menyembunyikan garis yang tidak terpengaruh oleh ekspresi. Yaitu jika ekspresi adalah pernyataan cetak dalam bahasa sed, maka baris yang tidak termasuk dalam pernyataan cetak tidak akan disertakan dalam output.

misalnya) sed -n…

Untuk lebih lanjut tentang opsi sed yang tersedia, lihat sed -help

Catatan akhir tentang perintah yang setara digunakan dalam contoh

Utilitas baris perintah berikut disertakan dalam contoh sed dengan perintah yang setara.

Catatan akhir di bagian akhir - dalam contoh perintah yang setara

Jika Anda bertanya-tanya apa yang terjadi pada karakter - dalam contoh, catatan ini untuk Anda. Saya menambahkan - karakter setelah sebagian besar perintah dalam contoh untuk mengisyaratkan bahwa kami mengharapkan input diterima melalui pipa. Itu adalah,

cat beberapa file | urutkan -R - | kepala -1

Namun, ketika perintah di sebelah kiri pipa hadir, kita dapat menghilangkan petunjuk sebagai berikut:.

cat beberapa file | sortir -R | kepala -1

Itulah yang terjadi dengan - karakter setelah perintah dalam contoh.

Catatan akhir tentang fungsi untuk pengaturan

Jika Anda mencari, berikut adalah fungsi untuk pengaturan untuk contoh di atas. Output yang diperoleh dengan menggunakan mendeklarasikan -f. Baca lebih lanjut tentang perintah mendeklarasikan di bash untuk lebih banyak penggunaan.

Perintah

kata-kata ()

barisan 100

batang ()

gema ---

php lama ()

echo 'ereg($UA,"Bottybot")'

Intinya

Saya menikmati menulis contoh Bash sed dan bahkan mengambil beberapa trik tambahan di sepanjang jalan. Sed adalah utilitas baris perintah yang kuat dan bahasa ekspresif untuk memanipulasi file teks. Jika Anda suka belajar tentang sed, jangan khawatir masih banyak lagi yang belum tersentuh. teruskan.

Kontrol & kelola gerakan mouse di antara beberapa monitor di Windows 10
Manajer Mouse Tampilan Ganda memungkinkan Anda mengontrol & mengonfigurasi gerakan mouse di antara beberapa monitor, dengan memperlambat gerakannya di...
WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...
Tombol klik kiri mouse tidak berfungsi pada Windows 10
Jika Anda menggunakan mouse khusus dengan laptop, atau komputer desktop, tetapi but tombol klik kiri mouse tidak berfungsi pada Windows 10/8/7 untuk b...