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 sedargument 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
gKomenda nie została podana specyfikator linia, ale poprzedzające dkomenda ma specjalną klauzulę „ start następnego cyklu. ”, A to zapobiega guruchamianiu na wszystkich liniach oprócz ostatniego.
Co do znaczenia każdego polecenia:
- Pierwszy
hnastępnie Hs na każdej kopii wiersza powiedział linie wejściowe sed„s hold przestrzeni . (Pomyśl o dowolnym buforze tekstowym.)
- Następnie
dodrzuca każdą linię, aby zapobiec zapisaniu tych linii na wyjściu. Miejsce do przechowywania jest jednak zachowane.
- Wreszcie, w ostatnim wierszu,
gprzywraca akumulację każdej linii z przestrzeni wstrzymania, dzięki czemu sedjest 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 \ns.