Contoh Bash Sed

Bash Sed Examples



Bash membolehkan anda melakukan penggantian corak menggunakan pengembangan pemboleh ubah seperti ($ {var / pattern / penggantian}). Oleh itu, adakah sed seperti ini (sed-e 's / pattern / penggantian /'). Namun, ada lebih banyak hal daripada menggantikan corak dalam fail teks. Di sini kita akan menemui semula sed, contohnya, dengan perintah dan aliran kerja yang setara untuk membantu tugas sehari-hari.

Persediaan untuk contoh sed

Berikut adalah panduan ringkas untuk menyiapkan contohnya, yang akan saya cuba untuk tidak membuat terlalu banyak.







kata-kataadalah fail teks yang mengandungi angka 1 hingga 100. Jika anda tidak yakin dengan perintah untuk membuatnya, lihat Fungsi eksport untuk xargs di Bash Export Command. Anda tidak akan pernah tahu bahawa ini akan berlaku dalam temu ramah skrip shell anda yang seterusnya.



baradalah fail teks yang mengandungi satu baris -.



lama-phpadalah fail teks yang mengandungi baris PHP lama yang akan pecah dalam php7 atau lebih baru. (Petunjuk: ereg)





Perhatikan bahawa semua fungsi yang dijelaskan di atas boleh didapati di bawah pada Catatan pada fungsi untuk penyediaan.

Contohnya dengan perintah yang setara

Dalam persekitaran baris perintah, anda akan dapati terdapat lebih daripada satu penyelesaian untuk tugas tertentu. Walau bagaimanapun, sebahagian besarnya, anda ingin mengikuti jalan yang menghasilkan rintangan paling sedikit. Berikut adalah senarai contoh perintah sed dengan perintah setara yang sesuai, di mana beberapa akan dibahas secara terperinci di bawah.



1. Cetak garis rawak (bersamaan dengan mengisih -R - | kepala -1)

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

2. Cetak baris terakhir dalam fail (bersamaan dengan kepala -1 -)

sed -n '$ p'-

3. Cetak 10 baris pertama dalam fail (bersamaan dengan kepala -n 10 -)

sed '10q'-

4. Cetak baris pertama dalam fail (bersamaan dengan ekor -1 -)

sed -n '1p'-

5. Padamkan semua contoh watak (bersamaan dengan tr –hapus ‘0’ -, di mana 0 adalah watak yang ingin kita hapus)

sed -Dan 's / 0 // g'-

6. Tukar fail csv ke tsv (bersamaan dengan tr ',' ' t' -)

sed -Dan 's /, / t / g'-

7. Tambahkan baris ke fail (setara dengan bar kucing -)

sed '$ a ---'-

8. Garis tambah ke fail (setara dengan bar - kucing)

sed '1i ---'-

9. Cetak semua baris dalam fail (bersamaan dengan kucing -)

sed -n -Dan 'p'-

10. Cetak garis yang sepadan dengan corak (setara dengan grep -e '^ 1' -)

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

11. Padamkan garis yang sepadan dengan corak (setara dengan grep -v -e '^ 1' -)

sed -Dan '/ ^ 1 / d'-

12. Dapatkan bilangan baris dalam fail (bersamaan dengan wc -l -)

sed -n -Dan '$ ='-

13. Tulis ke fail di latar belakang (perintah setara tee)

sed 'di$ {1}'-

Contohnya menggunakan sed untuk melaksanakan perintah tee

Tepat di atas, ada contoh berlabel Tulis ke fail di latar belakang. Jenis bunyi seperti arahan tee. Baiklah. Di sini kita akan memperluas bagaimana menerapkan fungsi untuk menggantikan tee in bash menggunakan sed.

Perintah

tee ()
{
ujian $ {#} -eq 1 || kembali;
sed 'di$ {1}'-
}
utama()
teeini;
kucingini

utama

Pengeluaran

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 senarai bilangan bulat dari 1 hingga 10. Yang pertama adalah dari perintah seq. Yang kedua kami dapatkan dari kucing fail yang ditulis dalam tee. Saya tahu ia tidak masuk akal tetapi berjaya!

Contohnya menggunakan sed untuk mencetak garis rawak dalam fail

Anggaplah bahawa kita ingin mencetak garis rawak dalam fail menggunakan bash dan sedikit sed. Bolehkah kita melakukannya? Ya kita boleh! Ini caranya.

Laksanakan fungsi yang

  1. Mendapat bilangan baris dalam fail, L
  2. Menghasilkan nombor rawak antara 1 dan L, R
  3. Cetakan R

Fungsi mengharapkan input disalurkan dari luar.

Perintah

sebilangan()
{
fungsilc()
{
sed -n -Dan '$ ='-
};
fungsigaris cetak()
{
sed -n -Dan '$ {1}p '-
};
temp= $( mktemp );
kucing-> $ {temp};
kucing $ {temp} |garis cetak $((RANDOM%$( kucing $ {temp} |lc)+1 ));
rm $ {temp}
}

Contoh penggunaan (1)

seq 100 |_

Keluaran (1)

35

Contoh penggunaan (2)

curl https://linuxhint.com/bash_cut_command/ --senyap |tegangan|sebilangan

Lihat contoh di bawah, menggunakan sed untuk melucutkan tag HTML. Perhatikan bahawa contoh di atas kadang-kadang mengembalikan kosong untuk baris kosong. Sebagai latihan, ia dapat ditingkatkan.

Menggunakan sed untuk mencetak baris dalam fail

Katakan bahawa anda ingin melaksanakan fungsi dalam bash untuk mencetak baris tertentu dalam fail. Mencuba mencetak satu baris dalam fail menggunakan gelung dalam bash, kepala, ekor, atau awk terlalu banyak kerja untuk mencetak garis dalam fail. Perkara yang baik yang kita ada. Fungsi yang dihasilkan menggunakan sed adalah seperti berikut.

Perintah

garis cetak()
{
sed -n '$ {1}p '-
}

Sekarang mari kita lihat apa yang berlaku apabila kita menggunakan garis cetak pada kata-kata.

Perintah

kata-kata|garis cetaklima puluh

Pengeluaran

lima puluh

Baik. Nampak baik tetapi mari kita mencuba sesuatu yang kelihatan tidak remeh.

Perintah

menyatakan -xfkata-kata
menyatakan -xfgaris cetak
seq 1 10$(kata-kata| wc -tempat ) | xargs-ibash -c perkataan | garis cetak {} '

Pengeluaran

1
sebelas
dua puluh satu
31
41
51
61
71
81
91

Baik. Sekarang lebih seperti itu! Anda melihat bagaimana sed dapat digunakan dalam skrip bash untuk mencetak garis apa pun dalam fail.

Contohnya tanpa arahan yang setara

Dalam persekitaran baris perintah, kadang-kadang jalan menuju penyelesaian yang menghasilkan rintangan paling sedikit adalah cara sed; jika tidak, anda akhirnya melakukan lebih banyak pekerjaan daripada yang diperlukan di tempat pertama. Beberapa arahan boleh dipaparkan di bawah.

Perintah semua baris dalam skrip shell

sed -Dan / s / ^ / # / '-
Padamkan baris pertama
sed -Dan '1d'-
Padamterakhirgarisan
sed -Dan '$ d'-
Masukkan garis sebelum garis yang sepadan dengan corak
sed '/ 0 $ / i ---'-
Masukkan garis selepas garis yang sepadan dengan corak
sed '/ 0 $ / ---'-
Keluarkan tag html
sed -Dan 's /†*.// g'-
Naik taraf eregdalamkod php lama untuk dijalankandalamphp7 atau lebih baru
sed 's / ereg ( ([^,] * ). ([^)] * ) ./ strpos ( 2, 1) / g'
Periksasekiranya sedlebih awal daripada versi tertentu
sed -Dan 'v 4.5'-

Contoh percabangan versi sed dalam bash

Di atas dalam contoh, ada garis untuk Memeriksa apakah sed lebih awal dari versi tertentu yang dapat kita gunakan untuk menerapkan versi percabangan dalam bash, yang saya percaya lebih mudah daripada mencoba menerapkan fungsi untuk membandingkan angka versi dari output sed-versi . Satu-satunya masalah ialah jika ada versi sed yang lebih awal yang tidak menyokong perintah v, maka kita berada dalam masalah.

Perintah

test-sed-version-at-most() {
membuang -n | sed 'v$ {1}'-2> /penipu/batal
}
versi percubaan()
{
membuang -n 'Versi$ {1}. Baik. Adakah ia ';
test-sed-version-at-most$ {1} && {
membuang -n 'tua';
benar
} || {
membuang -n 'baru'
};
membuang 'jalan.'
}
utama()
{
tempatanv;
untukvdalam 4.{4,5};
buat
versi percubaan$ {v};
selesai
}
utama

Pengeluaran

Versi4.4. Baik. Lakukan dengan cara lama.
Versi4.5. Baik. Lakukan dengan cara baru.

Perhatikan bahawa versi sed yang berjalan di mesin saya untuk mengetik watak-watak ini adalah 4.4, yang akan menjelaskan output di atas. Juga, pada masa yang sama, versi terbaru gnu sed adalah 4.7, lebih kurang 3 tahun lebih tua daripada yang saya ada. Sedang saya sudah tua! Sebenarnya, dalam versi 4.0.6, sebuah parameter ditambahkan pada perintah versi sehingga strategi ini berfungsi untuk semua kata setidaknya v4.0.6, yang ringan mengingat versi tersebut telah dirilis pada awal tahun 2003. Anda bagus.

Saya melakukan penggalian tambahan, sebenarnya BERITA membaca kod sumber terkini. Versi 4.6 mempunyai ciri baru, –debug yang membuang skrip dan memberi garisan output. Ini membolehkan anda menerjemahkan skrip sed yang dihasilkan oleh fungsi dalam bentuk bash ke kanonik. Sejuk! Jangan lupa bahawa anda memerlukan versi yang lebih baik dalam bash. Di sinilah contoh sed ini dimainkan.

Contoh fungsi bash menggunakan sed untuk melucutkan tag HTML

Dalam contoh di atas terdapat garis untuk menghilangkan tag HTML. Mari kita masukkan ke dalam fungsi bash dan gunakan untuk menghilangkan semua tag HTML dari artikel terakhir yang saya tulis.

Perintah

tegangan()
{
sed -Dan 's /†*.// g'-
}
curl https://linuxhint.com/bash_cut_command/ --senyap |tegangan

Saya tidak boleh mengatakan bahawa ia sempurna tetapi sekurang-kurangnya boleh dibaca di terminal.

Contoh Sed dengan aliran kerja: Contoh alur kerja: ganti semua selamat menggunakan find, grep, dan sed

Adalah selamat untuk mengatakan bahawa perubahan yang dibuat menggunakan sed dengan pilihan -i tidak dapat dipulihkan. Ini adalah kecuali anda benar-benar yakin teks apa yang akan diganti, anda mungkin akan mempunyai satu watak yang kurang daripada yang dimaksudkan. Itulah sebabnya dalam contoh ini, kami akan menggunakan sed dalam aliran kerja untuk mengganti teks dengan selamat dalam semua fail yang telah anda pilih.

Aliran Kerja

  1. cari
  2. cengkaman
  3. sed
cari

Di sini anda akan memilih fail yang akan diganti. Saya cadangkan menggunakan arahan seperti berikut:

cari -jenisf-nama | cengkaman -v-Dan| xargs-i ...

Sebagai contoh, anda mungkin mahu menghadkan fail untuk menggantikan fail PHP tidak termasuk direktori git repositori seperti berikut.

cari -jenisf-nama*.php| cengkaman -v -Dan '.go' | xargs -i...

Baca lebih lanjut mengenai perintah xargs dalam bash.

cengkaman

Seterusnya, kita akan mencuba dan memadankan beberapa_pattern dalam fail yang dipilih seperti berikut. Perhatikan bahawa kerana kita menggunakan pilihan -o untuk grep, output hanya akan menunjukkan rentetan yang sesuai jika ada.

cari -jenisf-nama*.php| cengkaman -v -Dan '.go' |
xargs -i cengkaman -Dansebilangan_papan-atau

Perintah di atas harus mengembalikan senarai rentetan yang sepadan dengan some_pattern.

sed

Akhirnya, kami ingin mengganti semua rentetan yang sepadan dengan beberapa_pattern. Untuk melakukan itu, kita perlu menukar grep menjadi sed seperti berikut.

cari -jenisf-nama*.php| cengkaman -v -Dan '.go' |
xargs -i sed -i -Dans/sebilangan_papan/penggantian/g

Perintah grep menjadi sed -i dan pilihan -o dikeluarkan. Dan di sana anda memilikinya.

Sekarang anda boleh memeriksa rentetan apa yang akan diganti sebelumnya dan bukannya menguji nasib anda.

Catatan pada pilihan yang digunakan dalam contoh

Berikut adalah senarai pilihan yang digunakan dalam contoh-contoh yang dibincangkan secara ringkas.

Pilihan Penerangan
-i Edit di tempat. Sekiranya input adalah fail (tidak dimasukkan) hasil ekspresi akan menimpa kandungan fail.

Sed menerima satu

cth) sed -n ...

-Dan -e bermaksud ungkapan. Parameternya adalah ungkapan dalam bahasa sed.

Sed menerima banyak

cth) sed -e'expr1 '-e'expr2'

-n Hides line tidak terpengaruh oleh ungkapan. Iaitu jika ungkapan itu adalah pernyataan cetak dalam bahasa sed, maka baris yang tidak termasuk dalam pernyataan cetak tidak akan dimasukkan dalam output.

cth) sed -n ...

Untuk lebih lanjut mengenai pilihan sed yang ada, lihat bantuan

Catatan akhir pada arahan yang setara digunakan dalam contoh

Utiliti baris perintah berikut dimasukkan dalam contoh sed dengan perintah yang setara.

  • mengurut
  • kepala
  • ekor
  • cengkaman
  • kucing
  • NS
  • tee

Catatan pada trailing - contohnya perintah yang setara

Sekiranya anda tertanya-tanya apa yang berlaku - watak dalam contoh, nota ini adalah untuk anda. Saya menambahkan watak - watak setelah kebanyakan perintah dalam contoh menunjukkan bahawa kami mengharapkan input diterima melalui paip. Itu dia,

kucingbeberapa fail| mengurut -R-| kepala -1

Namun, apabila arahan di sebelah kiri paip ada, kita dapat menghilangkan petunjuk seperti berikut.

kucingbeberapa fail| mengurut -R | kepala -1

Itulah yang berlaku dengan - watak selepas perintah dalam contoh.

Catatan pada fungsi untuk persediaan

Sekiranya anda mencari, berikut adalah fungsi penyediaan untuk contoh di atas. Output yang diperoleh menggunakan menyatakan -f. Baca lebih lanjut mengenai perintah menyatakan dalam bash untuk lebih banyak penggunaan.

Perintah

kata-kata()
{
seq 100
}
bar()
{
membuang ---
}
lama-php()
{
membuang 'ereg ($ UA,' Bottybot ')'
}

Pokoknya

Saya seronok menulis contoh Bash sed dan juga mengambil beberapa muslihat tambahan sepanjang perjalanan. Sed adalah utiliti baris perintah dan bahasa ekspresif yang kuat untuk memanipulasi fail teks. Sekiranya anda suka belajar tentang sed, jangan bimbang masih banyak lagi yang perlu disentuh. Sedap.