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 sed
sınırlanan (varsayılan olarak) bir dize olan ve her biri \n
iç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, sed
API 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 sed
olan 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 sed
spec:
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 sed
arayabilir 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 P
karakterle 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 sed
girdi 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 dc
hesap makinesi köşeli parantezler arasındaki girişte dizeleri tırnak içine alır ve P
komut hem \n
ewline 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 dc
kullanacağız:
[2015-01 ]P
5000
- Numarayı
5000
yığı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
p
yığının üstünü, ardından yığının \n
dışına atmadan ewline ekleyin.
c