Biorąc wszystko pod uwagę, pożeranie całego pliku może być najszybszym sposobem.
Podstawowa składnia jest następująca:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Pamiętaj, że pożeranie całego pliku może nie być opcją, jeśli plik jest ogromnie duży. W takich przypadkach inne podane tutaj odpowiedzi oferują niestandardowe rozwiązania, które z pewnością będą działać na małej przestrzeni pamięci.
We wszystkich innych sytuacjach hackowania i slashowania, -e '1h;2,$H;$!d;g'
po prostu poprzedzanie, po którym następuje oryginalny sed
argument wyrażenia regularnego, prawie kończy zadanie.
na przykład
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
Co ma -e '1h;2,$H;$!d;g'
zrobić?
1
, 2,$
, $!
Części są linia projektantom ten limit, który wyściełającej bezpośrednio następujące polecenie działa na.
1
: Tylko pierwsza linia
2,$
: Wszystkie linie zaczynające się od drugiej
$!
: Każda linia inna niż ostatnia
Tak rozszerzone, to dzieje się w każdym wierszu wejścia linii N.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
g
Komenda nie została podana specyfikator linia, ale poprzedzające d
komenda ma specjalną klauzulę „ start następnego cyklu. ”, A to zapobiega g
uruchamianiu na wszystkich liniach oprócz ostatniego.
Co do znaczenia każdego polecenia:
- Pierwszy
h
następnie H
s na każdej kopii wiersza powiedział linie wejściowe sed
„s hold przestrzeni . (Pomyśl o dowolnym buforze tekstowym.)
- Następnie
d
odrzuca każdą linię, aby zapobiec zapisaniu tych linii na wyjściu. Miejsce do przechowywania jest jednak zachowane.
- Wreszcie, w ostatnim wierszu,
g
przywraca akumulację każdej linii z przestrzeni wstrzymania, dzięki czemu sed
jest w stanie uruchomić wyrażenie regularne na całym wejściu (a nie w sposób liniowy na raz), a zatem może dopasuj na \n
s.