sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... drukuje ...
2015-01 6000
2015-02 8000
2015-03 10000
Tak więc powyżej deklaruję wyrażenie regularne, które definiuje zasięg pola, który składa się z pojedynczej sekwencji znaków o *
zmiennej długości , które ^
nie są <spacja>, po której następuje bezpośrednio pojedyncza sekwencja znaków o *
zmiennej długości, <p> . Ta deklaracja jest stosowana do sed
przestrzeni wzorców, która jest łańcuchem ograniczonym (domyślnie) każdym \n
znakiem ewline występującym na wejściu, i który jest rekurencyjnie zastępowany (domyślnie) następnym dla każdego wystąpienia tego samego.
Interfejs tej deklaracji jest dwojaki, a na każdym poziomie jest w pełni regulowany i określony przez co najmniej jedną międzynarodową oficjalną komisję normalizacyjną IEEE, aby zapewnić przewidywalne stosowanie sed
składni poleceń. Na przykład sed
składnia API jest stosowana w tym przypadku do polecenia /
adresowego (które zawsze jest pierwszym składnikiem każdego polecenia ubstitution) , ale jego treść jest interpretowana przez bardziej podstawowy interfejs API jako podzbiór tego określonego dla parametru funkcja w standardowej biblioteki C ./
sed s///
regcomp()
Mogę wypowiadać te stwierdzenia pewnie, ponieważ niesed
jest to tylko program, ale raczej skompilowany plik wykonywalny nazwany sed
na mojej maszynie podobnej do Uniksa jest implementacją dobrze zdefiniowanej, historycznie ustalonej i kontrolowanej przez normy sed
aplikacji regularnego systemu biblioteki dopasowujące wyrażenia.
Ze sed
specyfikacji:
sed
Narzędzie wspiera BRES opisane w XBD podstawowych wyrażeń regularnych ...
... gdzie znajdujemy ...
Oba BRES i Eres są obsługiwane przez interfejs Regular Expression Matching wolumenu systemu interfejsów POSIX.1-2008 mocy regcomp()
, regexec()
oraz funkcji związanych.
Aplikacja, która domaga regcomp()
się przedstawić wzór ciąg i ...
... regcomp()
funkcja ta skompiluje wyrażenie regularne zawarte w ciągu wskazanym przez argument wzorca i umieści wyniki w strukturze preg ...
Aby zareagować na to, wspomniana aplikacja będzie odnosić się do regcomp()
funkcji pomocniczej ...
... [t] regexec()
funkcja porównuje łańcuch zakończony znakiem null określony przez łańcuch ze skompilowanym wyrażeniem regularnym preg zainicjowanym przez poprzednie wywołanie regcomp()
...
... regexec()
wypełnia elementów [an] tablicy z przesunięciami podciągi z ciągu znaków , które odpowiadają \(
nawiasach podwyrażeń \)
na wzór ... wzór sama liczy się jako podwyrażenie ...
... [t] regexec()
funkcja musi wypełnić wszystkie elementy nmatch w pmatch , gdzie nmatch i pmatch są dostarczane przez aplikację, nawet jeśli niektóre elementy pmatch nie odpowiadają podwyrażeniom wzorca .
I kiedy to zrobię ...
/[^ ]* */
... sed
najpierw kompiluje wyrażenie regularne i przechowuje wyniki w pamięci, a następnie stosuje zapisany tam skompilowany automat do zawartości mojej przestrzeni wzorcowej tyle razy, ile jest to konieczne do wypełnienia mojego polecenia. Za każdym razem, gdy tak się dzieje, wynikiem jest tablica jednego lub więcej pól rozdzielanych zerami, które są rozdzielane przy odsunięciu przez regexec()
.
A kiedy to zrobię ...
//
... aby wskazać, że należy użyć ostatnio zdefiniowanego wyrażenia regularnego, sed
może po prostu wywołać regexec()
ponowne użycie wstępnie skompilowanego wyrażenia regularnego, ale możliwe, że zastosuje go tym razem do zmienionego argumentu ciągu lub zastosuje nowe parametry nmatch jako polecenie.
A dokładniej jeszcze ...
s/[^ ]* */[&]P/
- zamień pierwsze wystąpienie wzoru w przestrzeni wzorów na
[
lewy nawias kwadratowy, potem na &
siebie, potem na ]
prawy nawias kwadratowy, po którym następuje P
znak.
s//&+pc/3
- zastosuj ostatnio użyte wyrażenie regularne ponownie do bieżącej przestrzeni wzorca i zastąp
3
trzecie wystąpienie wzorca w przestrzeni wzorca &
, a po nim dołączony ciąg +pc
.
I tak dla każdego wiersza sed
wejścia zapisuje na standardowe wyjście, biorąc pod uwagę twoje przykładowe dane:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Może to wyglądać dziwnie, ale dc
kalkulator cytuje łańcuchy w danych wejściowych między nawiasami kwadratowymi, a P
polecenie zarówno wydrukuje górę stosu bez dołączania \n
ewline, jak i następnie usunie go ze stosu wejściowego.
I tak, używając pierwszego wiersza jako przykładu, dc
zrobi:
[2015-01 ]P
P
rint i pop na szczycie stosu
5000
- Wciśnij liczbę
5000
na wierzch stosu i popchnij wszystkie elementy znajdujące się obecnie na stosie (teraz żaden) o jeden.
1000
- to samo, ale tym razem liczba 5000 na górze głównego stosu zostaje przesunięta o jeden i staje się drugim elementem na stosie.
+
- Dodaj do siebie dwie górne liczby ze stosu, usuń obie ze stosu i wsuń sumę na szczyt stosu.
- Daje to stos składający się tylko z liczby
6000
.
- Jest to błąd składniowy, jeśli jeden z dwóch górnych elementów na stosie jest
[
ciągiem ]
.
p
p
przeglądnij górę stosu, a następnie dołączoną \n
ewline bez wyskakiwania z niego ze stosu.
c