sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... baskılar ...
2015-01 6000
2015-02 8000
2015-03 10000
Bu yüzden bir ilan üzerine düzenli ekspresyonu bir tanımlayan alan ölçüde bir oluşmaktadır *değişken uzunluklu olan karakterlerin tek bir dizi ^olup <boşluk> bir ve hemen ardından *değişken uzunluklu olan karakterlerin tek bir dizi <boşluk> . Bu bildirim, girişte meydana gelen her bir ewline karakteri tarafından sedsınırlanan (varsayılan olarak) bir dize olan ve her biri \niçin yinelenen (varsayılan olarak) bir sonraki ile değiştirilen desen alanına karşı uygulanır .
Bu bildirimin arabirimi iki katlıdır ve her düzeyde, komut sözdiziminin öngörülebilir uygulanmasını sağlamak için en az bir uluslararası IEEE resmi standartlar komitesi tarafından tamamen düzenlenir ve belirtilir sed. Örneğin, sedAPI sözdizimi bu durumda /adres /komutuyla (her zaman herhangi bir sed s///ikame komutunun ilk bileşenidir ) uygulanır , ancak bunun içeriği daha temel bir API tarafından, regcomp()işlevi standart C kütüphanesinde .
Çünkü, güvenle bu ifadeleri yapabilirsiniz sedolan değil daha ziyade, çalıştırılabilir adlı derlenmiştir, sadece bir program, ama sedüzerinde benim Unix benzeri makine bir olan uygulama tarihsel kurulan iyi tanımlanmış bir ve standartlar kontrollü sed uygulama sistemimin düzenlidir- arasında ifade eşleme kütüphaneleri.
Gönderen sedspec:
Tesis sed, XBD Temel Düzenli İfadelerde açıklanan BRE'leri destekleyecektir ...
... bulduğumuz yer ...
Bres ve Eres Hem altında POSIX.1-2008 Sistem Arabirimleri hacmindeki Normal İfade Eşleştirme arayüzü tarafından desteklenir regcomp(), regexec()ve ilgili işlevler.
Aramalar bir uygulama regcomp()bir desen dizesi sunacak ve ...
... [t] regcomp()işlevi, desen argümanı tarafından işaret edilen dizgideki düzenli ifadeyi derleyecek ve sonuçları yapıya yerleştirecektir ...
Buna göre hareket etmek için, söz konusu uygulama daha sonra regcomp()eşlik eden fonksiyona atıfta bulunacaktır ...
... [t] de regexec()işlev ile belirtilen boş sonlandırılmış değeriyle karşılaştırır dize derlenmiş normal ifade ile Süleyman Demirel önceki bir çağrı ile başlatıldı regcomp()...
... regexec()oluşan altdizgelerin uzaklıklar ile [bir] dizinin elemanları dolduracaklardır dize uygun \(parantezli düzenli ifadelerin \)bir desen ... deseni kendisi alt ifadenin bir olarak sayılır ...
... O [t] regexec()bütün doldurmalısınız işlev nmatch unsurları pmatch , nmatch ve pmatch bazı unsurlar bile, uygulama tarafından sağlanmaktadır pmatch içinde subexpressions karşılık gelmez desen .
Ve böylece yaptığımda ...
/[^ ]* */
... sedönce normal ifadeyi derler ve sonuçları hafızaya kaydeder, daha sonra orada saklanan derlenmiş otomatı komutumu yerine getirmek için gerekli olduğu kadar desen alanımın içeriğine uygular. Her seferinde sonuç, döndürülen ofsetlerde sınırlandırılmış bir veya daha fazla boş sınırlandırılmış alan dizisidir regexec().
Ve yaptığımda ...
//
... en son tanımlanmış normal ifadenin kullanılması gerektiğini belirtmek için , önceden derlenmiş düzenli ifadeyi tekrar tekrar sedarayabilir regexec(), ancak muhtemelen bu kez değiştirilen bir dize argümanına uygulayabilir ya da komut olarak yeni nmatch parametrelerini uygulayabilir .
Daha spesifik olarak hala ...
s/[^ ]* */[&]P/
- desen uzayındaki desenin ilk oluşumunu önce
[sol köşeli ayraçla, sonra &kendisiyle, ardından ]sağ köşeli ayraçla ve ardından bir Pkarakterle değiştir.
s//&+pc/3
- Geçerli desen uzaya tekrar son kullanılan normal ifade uygulamak ve yerine
3üçüncü oluşumunu deseni ile desen uzayda &kendisi eklenen dize izledi +pc.
Ve böylece her bir sedgirdi girişi için örnek verileriniz göz önüne alındığında stdout'una yazar:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Bu garip görünebilir, ancak dchesap makinesi köşeli parantezler arasındaki girişte dizeleri tırnak içine alır ve Pkomut hem \newline eklemeden yığının üstünü yazdırır hem de daha sonra giriş yığınından çıkarır.
Ve böylece, orada ilk satırı örnek olarak dckullanacağız:
[2015-01 ]P
5000
- Numarayı
5000yığının üstüne itin ve o anda yığındaki tüm öğeleri (şimdi yok) birer birer aşağı itin .
1000
- ancak bu sefer ana yığının üstündeki 5000 sayısı bir aşağı itilir ve yığındaki ikinci öğe olur.
+
- Yığındaki ilk iki sayıyı toplayın, her ikisini de yığının dışına çıkarın ve toplamı yığının üstüne itin.
- Bu, yalnızca sayıdan oluşan bir yığınla sonuçlanır
6000.
- Bu, yığındaki en üstteki iki öğeden biri
[dize ise sözdizimi hatasıdır ].
p
pyığının üstünü, ardından yığının \ndışına atmadan ewline ekleyin.
c