Szybka odpowiedź
sed ':a;N;$!ba;s/\n/ /g' file
- : a utwórz etykietę „a”
- N. dodaj następny wiersz do obszaru wzorów
- $! jeśli nie ostatnia linia , ba gałąź (przejdź do) oznacz „a”
- s zamiennik , / \ n / regex dla nowej linii , / / spacją , / g dopasowanie globalne (tyle razy, ile to możliwe)
sed będzie przechodzić od kroku 1 do 3, aż dojdzie do ostatniej linii, dopasowując wszystkie linie do obszaru wzorów, gdzie sed zastąpi wszystkie \ n znaków
Alternatywy
Wszystkie alternatywy, w przeciwieństwie do sed , nie będą musiały dotrzeć do ostatniej linii, aby rozpocząć proces
z uderzeniem , powoli
while read line; do printf "%s" "$line "; done < file
z Perl , sed -jak prędkość
perl -p -e 's/\n/ /' file
z tr , szybszy niż sed , można zastąpić tylko jedną postacią
tr '\n' ' ' < file
z wklejaniem , prędkość podobna do tr , można zastąpić tylko jedną postacią
paste -s -d ' ' file
z awk , tr- podobną prędkością
awk 1 ORS=' ' file
Inne alternatywy, takie jak „echo $ (<plik)”, są powolne, działają tylko na małych plikach i muszą przetworzyć cały plik, aby rozpocząć proces.
5.10 Dlaczego nie mogę dopasować ani usunąć nowego wiersza za pomocą
sekwencji ucieczki \ n ? Dlaczego nie mogę dopasować 2 lub więcej linii za pomocą \ n?
\ N nigdy nie będzie pasować do nowej linii na końcu linii, ponieważ
nowa linia jest zawsze usuwana przed umieszczeniem linii w obszarze
wzorów. Aby wstawić 2 lub więcej linii do przestrzeni wzorów, użyj
polecenia „N” lub czegoś podobnego (takiego jak „H; ...; g;”).
Sed działa w ten sposób: sed odczytuje jedną linię na raz, odcina
kończącą się nową linię , umieszcza to, co pozostało w przestrzeni wzorcowej, w której
skrypt sed może ją adresować lub zmieniać, a gdy
drukowana jest przestrzeń wzorcowa, dodaje nową linię do standardowego wejścia (lub do pliku). Jeśli
przestrzeń wzoru zostanie całkowicie lub częściowo usunięta za pomocą „d” lub „D”,
nowa linia nie jest dodawana w takich przypadkach. Tak więc skrypty lubią
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
NIGDY nie zadziała, ponieważ końcowy znak nowej linii jest usuwany przed
wstawieniem linii do obszaru wzorów. Aby wykonać powyższe zadania,
użyj jednego z tych skryptów:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Ponieważ wersje sed inne niż GNU sed mają ograniczenia wielkości
bufora wzorców, należy tutaj preferować narzędzie uniksowe „tr”.
Jeśli ostatni wiersz pliku zawiera nową linię, GNU sed doda
tę nową linię do wyniku, ale usunie wszystkie inne, podczas gdy tr doda
usunie wszystkie nowe linie.
Aby dopasować blok dwóch lub więcej wierszy, istnieją 3 podstawowe opcje:
(1) użyj polecenia „N”, aby dodać następny wiersz do obszaru wzorów;
(2) użyj polecenia „H” co najmniej dwukrotnie, aby dołączyć bieżącą linię
do przestrzeni Hold, a następnie pobrać linie z przestrzeni Hold za
pomocą x, g lub G; lub (3) użyj zakresów adresów (patrz sekcja 3.3 powyżej),
aby dopasować linie między dwoma określonymi adresami.
Wybory (1) i (2)
wstawią \ n do przestrzeni wzorców, gdzie można ją adresować według potrzeb ('s / ABC \ nXYZ / alfabet / g'). Jeden przykład
użycia „N” do usunięcia bloku linii pojawia się w sekcji 4.13
(„Jak usunąć blok określonych kolejnych linii?”). Ten
przykład można zmodyfikować, zmieniając polecenie delete na coś
innego, na przykład „p” (drukuj), „i” (wstaw), „c” (zmiana), „a” (dołącz)
lub „s” (zamiennik) .
Choice (3) nie położy \ n do przestrzeni wzorca, ale nie
pasuje do bloku kolejnych wierszy, więc może się okazać, że nie masz
jeszcze potrzebne \ n, aby znaleźć to, czego szukasz. Ponieważ
wersja GNU sed 3.02.80 obsługuje teraz tę składnię:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
oprócz tradycyjnych
adresów z zakresu „/ from here /, / to there / {...}” można całkowicie uniknąć użycia \ n.
tr
jest tylko odpowiednim narzędziem do zadania, jeśli zamienisz pojedynczy znak na pojedynczy znak, podczas gdy powyższy przykład pokazuje zamień znak nowej linii spacją .. Więc w powyższym przykładzie tr może działać .. Ale będzie później ograniczać.