sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... mencetak ...
2015-01 6000
2015-02 8000
2015-03 10000
Jadi di atas saya mendeklarasikan ekspresi reguler yang mendefinisikan tingkat -bidang yang terdiri dari urutan tunggal *panjang variabel yang ^tidak <spasi> diikuti segera oleh urutan tunggal *panjang variabel- karakter yang <spasi> . Deklarasi ini diterapkan terhadap sedruang pola, yang merupakan string yang dibatasi (secara default) oleh setiap \nkarakter ewline yang terjadi pada input, dan yang secara rekursif diganti (secara default) dengan yang berikutnya untuk setiap kemunculan yang sama.
Antarmuka untuk deklarasi ini dua kali lipat, dan pada setiap level diatur sepenuhnya dan ditentukan oleh setidaknya satu komite standar resmi IEEE internasional untuk memastikan penerapan sedsintaksis perintah yang dapat diprediksi . sedSintaks API , misalnya, diterapkan dalam kasus ini dengan perintah /alamat (yang selalu merupakan komponen pertama dari perintah ubstitusi) , tetapi konten yang sama diinterpretasikan oleh API yang lebih mendasar sebagai bagian dari yang ditentukan untuk fungsi dalam pustaka C. standar ./sed s///regcomp()
Aku bisa membuat pernyataan-pernyataan ini yakin, karena sedini bukan hanya sebuah program, tetapi, lebih tepatnya, disusun eksekusi bernama sedpada saya Unix-seperti mesin merupakan implementasi dari didefinisikan dengan baik, secara historis didirikan, dan standar-dikendalikan sed aplikasi dari regular sistem saya perpustakaan pencocokan ekspresi
Dari sedspec:
The sedutilitas akan mendukung serat dijelaskan dalam XBD Basic Regular Expressions ...
... di mana kita menemukan ...
Kedua serat dan Eres didukung oleh antarmuka Expression Matching Regular dalam volume Sistem Antarmuka dari POSIX.1-2008 bawah regcomp(), regexec()dan fungsi terkait.
Aplikasi yang memanggil regcomp()akan menampilkannya pola string dan ...
... [t] ia regcomp()berfungsi akan mengkompilasi ekspresi reguler yang terkandung dalam string yang ditunjukkan oleh pola argumen dan menempatkan hasil dalam struktur preg ...
Untuk menindaklanjutinya, aplikasi tersebut akan merujuk ke regcomp()fungsi pendamping ...
... [t] ia regexec()berfungsi membandingkan string diakhiri null-ditentukan oleh tali dengan ekspresi dikompilasi reguler preg diawali dengan panggilan sebelumnya untuk regcomp()...
... regexec()akan mengisi elemen [an] array dengan offset dari substring dari string yang yang sesuai dengan \(subexpressions kurung \)dari pola ... pola itu sendiri dianggap sebagai subexpression a ...
... [t] ia regexec()fungsinya harus mengisi semua elemen nmatch dari pmatch , di mana nmatch dan pmatch disediakan oleh aplikasi, bahkan jika beberapa elemen pmatch tidak sesuai dengan subekspresi dalam pola .
Dan ketika saya melakukannya ...
/[^ ]* */
... sedpertama mengkompilasi ekspresi reguler dan menyimpan hasilnya dalam memori, kemudian setelah itu mengompilasi-otomat yang disimpan di sana untuk isi ruang pola saya sebanyak yang diperlukan untuk memenuhi perintah saya. Setiap kali itu hasilnya adalah array dari satu atau lebih bidang null-delimited sebagai dibatasi pada offset yang dikembalikan oleh regexec().
Dan ketika saya melakukannya ...
//
... untuk menunjukkan bahwa ekspresi reguler yang paling baru didefinisikan harus digunakan, sedcukup panggil regexec()kembali menggunakan kembali ekspresi reguler yang dikompilasi, tetapi mungkin menerapkannya kali ini ke argumen string yang diubah atau menerapkan parameter nmatch baru seperti yang saya perintahkan.
Lebih khusus lagi ...
s/[^ ]* */[&]P/
- ganti kemunculan pola pertama dalam pola-ruang dengan
[braket persegi-kiri, lalu braket itu &sendiri, kemudian ]braket persegi-kanan diikuti oleh Pkarakter.
s//&+pc/3
- menerapkan ekspresi reguler yang terakhir digunakan lagi ke ruang pola saat ini, dan mengganti
3kemunculan pola ketiga dalam ruang pola dengan &dirinya sendiri diikuti oleh string yang ditambahkan +pc.
Dan untuk setiap baris sedinput, ia menulis ke stdout-nya, dengan memberikan contoh data Anda:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Ini mungkin terlihat aneh, tetapi dckalkulator mengutip string dalam inputnya di antara tanda kurung siku, dan Pperintah akan mencetak bagian atas tumpukan tanpa menambahkan garis \ntepi dan sesudahnya mengeluarkan yang keluar dari tumpukan input.
Jadi, menggunakan baris pertama di sana sebagai contoh, dcakan melakukan:
[2015-01 ]P
Pbongkar dan pop bagian atas tumpukan
5000
- Dorong nomor
5000ke atas tumpukan dan dorong semua elemen yang ada di tumpukan (sekarang tidak ada) turun satu per satu.
1000
- dulu, tetapi kali ini nomor 5000 di bagian atas tumpukan utama ditekan oleh satu, dan menjadi elemen kedua di tumpukan.
+
- Tambahkan dua angka teratas pada tumpukan bersama-sama, pop keduanya dari tumpukan dan dorong jumlahnya ke atas tumpukan.
- Ini menghasilkan tumpukan yang hanya terdiri dari angka
6000.
- Ini adalah kesalahan sintaks jika salah satu dari dua elemen teratas di stack adalah
[string ].
p
printis bagian atas tumpukan diikuti oleh \newline yang ditambahkan tanpa muncul dari tumpukan.
c