Jak mogę zastąpić nową linię (\n) za pomocą sed?

Jak mogę zastąpić znak nowej linii ("\n") spacją ("") using the sed?

Bezskutecznie próbowałem:

sed 's#\n# #g' file
sed 's#^$# #g' file
Jak to naprawić?
 1462
sed
Author: agc, 2009-08-09

30 answers

Użyj tego rozwiązania z GNU sed:

sed ':a;N;$!ba;s/\n/ /g' file

Spowoduje to odczytanie całego pliku w pętli, a następnie zastąpienie nowej linii spacją.

Wyjaśnienie:

  1. Utwórz etykietę za pomocą :a.
  2. dołącza bieżący i następny wiersz do przestrzeni wzorca za pomocą N.
  3. jeśli jesteśmy przed ostatnią linią, rozgałęziamy się do utworzonej etykiety $!ba ($! oznacza, że nie należy tego robić na ostatniej linii, ponieważ powinna być jedna ostateczna nowa linia).
  4. wreszcie substytucja zastępuje każda nowa linia ze spacją na przestrzeni wzorca (która jest całym plikiem).

Oto składnia kompatybilna z wieloma platformami, która działa z BSD i OS X sed (zgodnie z @ Benjie comment):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

Jak widzisz, użycie sed dla tego prostego problemu jest problematyczne. Dla prostszego i odpowiedniego rozwiązania zobacz ta odpowiedź .

 1605
Author: Zsolt Botykai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 17:56:14

sed jest przeznaczony do stosowania na wejściu liniowym. Chociaż może zrobić to, czego potrzebujesz.


Lepszym rozwiązaniem jest użycie polecenia tr w następujący sposób:

tr '\n' ' ' < input_filename

Lub całkowicie usunąć znaki nowej linii:

tr -d '\n' < input.txt > output.txt

Lub jeśli posiadasz wersję GNU (z długimi opcjami)

tr --delete '\n' < input.txt > output.txt
 1789
Author: dmckee --- ex-moderator kitten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-03 01:35:31

Szybka Odpowiedź

sed ':a;N;$!ba;s/\n/ /g' file
  1. :a Utwórz etykietę " a "
  2. N dołączenie następnego wiersza do przestrzeni wzorca
  3. $! jeśli nie ostatnia linijka, ba branch (go to) label " a "
  4. s substytut, /\n/ regex dla nowej linii, / / przez przestrzeń, /g global match (tyle razy, ile can)

Sed będzie przechodzić przez krok od 1 do 3 aż do ostatniego wiersza, aby wszystkie linie zmieściły się w przestrzeni wzorca, gdzie sed zastąpi wszystkie znaki \n


Alternatywy

Wszystkie alternatywy, w przeciwieństwie do sed nie będą musiały dotrzeć do ostatniego wiersza, aby rozpocząć proces

Z bash , slow

while read line; do printf "%s" "$line "; done < file

Z perlem, sed - jak prędkość

perl -p -e 's/\n/ /' file

Z tr, szybciej niż sed , może zastąpić tylko jednym znakiem

tr '\n' ' ' < file

Z wklej, tr - podobnie jak prędkość, może zastąpić tylko jednym znakiem

paste -s -d ' ' file

Z awk, tr - jak prędkość

awk 1 ORS=' ' file

Inna alternatywa jak "echo $( jest powolna, działa tylko na małych plikach i musi przetworzyć cały plik, aby rozpocząć proces.


Długa odpowiedź z sed FAQ 5.10

5.10. Dlaczego nie mogę dopasować lub usunąć newline using the \ N escape
Sekwencja? Dlaczego nie mogę dopasować 2 lub więcej linii używając \n?

\N nigdy nie będzie pasować do nowej linii na końcu linii, ponieważ
nowy wiersz jest zawsze usuwany przed umieszczeniem go w
przestrzeń wzorca. Aby uzyskać 2 lub więcej linii w przestrzeni wzorca, użyj
polecenie ' N 'lub coś podobnego (np.' H;...; g;').

Sed działa tak: sed czyta jedną linijkę na raz, odcina
kończenie nowej linii, stawia to, co jest w lewo w Przestrzeń wzorca gdzie
skrypt sed może go adresować lub zmieniać, a gdy przestrzeń wzorca
jest drukowany, dodaje nowy wiersz do stdout (lub do pliku). Jeśli
przestrzeń wzorca jest całkowicie lub częściowo usunięta za pomocą " d " lub "D",
newline to , a nie dodawane w takich przypadkach. Tak więc skrypty jak

  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ńcowa linia nowego wiersza jest usuwana przed
linia jest umieszczana w przestrzeni wzoru. Aby wykonać powyższe zadania,
zamiast tego 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 do rozmiaru
bufor wzorca, uniksowe narzędzie 'tr' ma być tutaj preferowane.
Jeśli ostatnia linia pliku zawiera znak nowej linii, GNU sed doda
ta nowa linia do wyjścia, ale usuwa wszystkie inne, podczas gdy tr
usuń wszystkie nowe linie.

Aby dopasować blok dwóch lub więcej linii, istnieją 3 podstawowe opcje:
(1) Użyj polecenia "N", aby dodać następny wiersz do przestrzeni wzorca;
(2) Użyj polecenia 'H' co najmniej dwa razy, aby dodać bieżącą linię
do przestrzeni przytrzymania, a następnie pobrać linie z przestrzeni przytrzymania
w tym celu należy użyć polecenia x, g lub G; lub (3) użyć zakresów adresów (patrz sekcja 3.3 powyżej)
aby dopasować linie pomiędzy dwoma podanymi adresami.

Wybory (1) i (2) umieszczą \n w przestrzeni wzorca, gdzie
może być adresowany zgodnie z życzeniem ('s/ABC\nxyz/alphabet/g'). Jeden przykład
o użyciu "N" do usunięcia a blok linii pojawia się w sekcji 4.13
("Jak usunąć blok konkretnych kolejnych linii?"). To
przykład można zmodyfikować, zmieniając polecenie delete na coś
w tym celu należy wykonać następujące czynności:]} lub " S " (substytut).

Choice (3) nie umieści \ n w przestrzeni wzorca, ale robi
dopasuj blok kolejnych linii, więc może być tak, że nie
nawet trzeba \n, aby znaleźć to, co szukasz. Od GNU sed
wersja 3.02.80 obsługuje teraz tę składnię:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

Oprócz tradycyjnego ' / stąd/, / tam / {...} 'range
adresów, możliwe jest całkowite uniknięcie użycia \N.

 537
Author: hdorio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Krótsza alternatywa awk:

awk 1 ORS=' '

Wyjaśnienie

Program awk zbudowany jest z reguł, które składają się z warunkowych bloków kodu, tj.:

condition { code-block }

Jeśli blok kodu jest pominięty, używana jest wartość domyślna: { print $0 }. Tak więc, {[3] } jest interpretowany jako warunek prawdziwy i {[4] } jest wykonywany dla każdej linii.

Kiedy awk odczytuje dane wejściowe, dzieli je na rekordy na podstawie wartości RS (Separator rekordów), która domyślnie jest znakiem nowej linii, więc awk będzie domyślnie analizuje linię wejściową. Podział polega również na oddzieleniu RS od rekordu wejściowego.

Teraz, podczas drukowania rekordu, ORS (Separator rekordu wyjściowego) jest dołączany do niego, domyślnie jest ponownie nowy wiersz. Tak więc zmieniając ORS na spację wszystkie nowe linie są zamieniane na spacje.

 230
Author: Thor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 13:00:41

Gnu sed posiada opcję -z dla rozdzielonych null rekordów (linii). Możesz po prostu zadzwonić:

sed -z 's/\n/ /g'
 162
Author: JJoao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 10:05:25

Wersja Perla działa zgodnie z oczekiwaniami.

perl -i -p -e 's/\n//' file

Jak zaznaczono w komentarzach, warto zauważyć, że ta edycja jest w miejscu. -i.bak da ci kopię zapasową oryginalnego pliku przed zastąpieniem na wypadek, gdyby twojeWyrażenie regularne nie było tak inteligentne, jak myślałeś.

 87
Author: ire_and_curses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 08:09:34

Kto potrzebuje sed? Oto sposób bash:

cat test.txt |  while read line; do echo -n "$line "; done
 47
Author: commonpike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-08 09:27:18

W celu zastąpienia wszystkich nowych linii spacjami za pomocą awk, bez wczytania całego pliku do pamięci:

awk '{printf "%s ", $0}' inputfile

Jeśli chcesz mieć ostatni nowy wiersz:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

Możesz użyć znaku innego niż spacja:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile
 28
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 06:41:01
tr '\n' ' ' 

Jest komendą.

Prosty i łatwy w użyciu.
 22
Author: Dheeraj R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 13:54:56

Trzy rzeczy.

  1. tr (lub cat, itp.) jest absolutnie niepotrzebny. (GNU) sed i (GNU) awk, Po połączeniu, mogą wykonać 99,9% dowolnego przetwarzania tekstu, którego potrzebujesz.

  2. Stream !/ align = "left" / linear {[5] } jest edytorem liniowym. Nie jest. Zobacz sed wykład aby uzyskać więcej informacji na temat różnicy. Większość ludzi myli sed jako liniowy, ponieważ domyślnie nie jest zbyt chciwy w dopasowywaniu wzorców do prostych dopasowań - na przykład, gdy wykonując wyszukiwanie wzorców i zastępując je jednym lub dwoma znakami, domyślnie zastępuje je tylko przy pierwszym znalezionym dopasowaniu (o ile nie określono inaczej poleceniem globalnym). Nie byłoby nawet polecenia globalnego, gdyby było oparte na wierszach, a nie na strumieniach, ponieważ oceniałoby tylko linie na raz. Spróbuj uruchomić ed; zauważysz różnicę. ed jest bardzo przydatne, jeśli chcesz iterację nad określonymi liniami( np. w pętli for), ale większość razy będziesz po prostu chciał sed.

  3. To powiedziawszy,

    sed -e '{:q;N;s/\n/ /g;t q}' file
    

    Działa dobrze w GNU sed w wersji 4.2.1. Powyższe polecenie zastąpi wszystkie znaki nowej linii spacjami. Jest brzydki i trochę kłopotliwy do wpisania, ale działa dobrze. {}'s można pominąć, ponieważ są one zawarte tylko ze względów rozsądku.

 21
Author: brent saner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 15:15:28

Łatwe do zrozumienia rozwiązanie

Miałem taki problem. Kicker polegał na tym, że potrzebowałem rozwiązania do pracy na systemach BSD (Mac OS X) i GNU (Linux i Cygwin) sed i tr:
$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

Wyjście:

foo
bar
baz

(has trailing newline)

Działa na Linuksie, OS X i BSD - nawet bez UTF-8 lub z gównianym terminalem.

  1. Użyj tr, aby zamienić nowy wiersz na inny znak.

    NULL (\000 lub \x00) jest ładny, ponieważ nie potrzebuje wsparcia UTF-8 i prawdopodobnie nie będzie używany.

  2. Użyj sed, aby dopasować NULL

  3. Użyj tr, aby zamienić dodatkowe nowe linie, jeśli ich potrzebujesz

 14
Author: coolaj86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 16:33:04

Odpowiedź z etykietą...

Jak mogę zastąpić nową linię (\n) za pomocą sed?

... nie działa w freebsd 7.2 W linii poleceń:

( echo foo ; echo bar ) | sed ':a;N;$!ba;s/\n/ /g'
sed: 1: ":a;N;$!ba;s/\n/ /g": unused label 'a;N;$!ba;s/\n/ /g'
foo
bar

Ale robi, jeśli umieścisz skrypt sed w pliku lub użyjesz -e do "zbudowania" skryptu sed...

> (echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g'
foo bar

Lub ...

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

Może sed W OS X jest podobny.

 13
Author: Juan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:33

Możesz użyć xargs :

seq 10 | xargs

Lub

seq 10 | xargs echo -n
 13
Author: Vytenis Bivainis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 16:38:16

Dlaczego nie znalazłem prostego rozwiązania z awk?

awk '{printf $0}' file

printf wyświetli każdą linię bez nowych linii, jeśli chcesz oddzielić oryginalne linie spacją lub innymi:

awk '{printf $0 " "}' file
 11
Author: Itachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-15 20:24:10

Nie jestem ekspertem, ale myślę, że w sed najpierw trzeba by dopisać następną linię do przestrzeni wzorca, używając "N". Z sekcji "Multiline Pattern Space" w "Advanced sed Commands" książki sed & awk (Dale Dougherty i Arnold Robbins; O ' Reilly 1997; strona 107 w podgląd):

Polecenie Multiline Next (N) tworzy wielowierszową przestrzeń wzorca, odczytując nową linię wejścia i dołączając ją do zawartości wzorca. Na oryginalna zawartość przestrzeni wzorca i nowej linii wejściowej są oddzielone znakiem nowej linii. Osadzony znak nowej linii może być dopasowany we wzorcach za pomocą sekwencji escape "\n". W wielowierszowej przestrzeni wzorcowej metacharakter " ^ " pasuje do pierwszego znaku przestrzeni wzorcowej, a nie znaków następujących po osadzonych znakach nowej linii. Podobnie, " $ " dopasowuje tylko końcową linię w przestrzeni wzorca, a nie osadzoną linię(y). Po wykonaniu następnej komendy sterowanie jest wtedy przekazywane do kolejnych komend w skrypcie.

From man sed:

[2addr]N

Dołącza następny wiersz wejścia do przestrzeni wzorca, używając osadzonego znaku nowej linii, aby oddzielić dołączony materiał od oryginalnej zawartości. Zauważ, że bieżący numer linii zmienia się.

Użyłem do przeszukiwania (wielu) źle sformatowanych plików dziennika, w których szukany ciąg może znaleźć się w "osieroconej" następnej linii.

 9
Author: Arjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jeśli masz dość pecha, aby mieć do czynienia z zakończeniami linii windows, musisz usunąć \r i \n

tr '\r\n' ' ' < $input > $output
 9
Author: StevenWernerCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 01:07:36

W odpowiedzi na powyższe rozwiązanie "tr", w systemie Windows (prawdopodobnie używającym wersji TR Gnuwin32), proponowane rozwiązanie:

tr '\n' ' ' < input

Nie działa dla mnie, to albo błąd lub faktycznie zastąpić \n w/ " z jakiegoś powodu.

Używając innej funkcji tr, opcja "delete" - d zadziałała:

tr -d '\n' < input

Lub "\R\n "zamiast" \N "

 7
Author: John Lawler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-25 22:54:36

Użyłem podejścia hybrydowego, aby ominąć nową linię, używając tr, aby zastąpić nowe linie tabulatorami, a następnie zastąpić tabulatorami, co tylko chcę. W tym przypadku, "
" ponieważ próbuję wygenerować przerwy HTML.

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
 7
Author: rfengr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 16:33:35

Kuloodporne rozwiązanie. Binary-data-safe i zgodne z POSIX, ale powolne.

POSIX sed wymaga wejścia zgodnie z plik tekstowy POSIX oraz linia POSIX definicje, więc NULL-bajty i zbyt długie linie nie są dozwolone i każda linia musi kończyć się znakiem nowej linii (włącznie z ostatnią linią). Utrudnia to wykorzystanie sed do przetwarzania dowolnych danych wejściowych.

Poniższe rozwiązanie pozwala uniknąć sed i zamiast tego konwertuje bajty wejściowe na kody ósemkowe, a następnie na bajtów ponownie, ale przechwytuje kod ósemkowy 012 (newline) i wypisuje zastępczy ciąg znaków w jego miejsce. O ile wiem, rozwiązanie jest zgodne z POSIX, więc powinno działać na wielu różnych platformach.

od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
  while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done

Dokumentacja odniesienia POSIX: sh , język poleceń powłoki , od , tr , grep , Czytaj , [, printf .

Obie read, [, i printf są wbudowane w co najmniej bash, ale to prawdopodobnie nie gwarantowane przez POSIX, więc na niektórych platformach może być tak, że każdy bajt wejściowy uruchomi jeden lub więcej nowych procesów, co spowolni działanie. Nawet w bash to rozwiązanie osiąga tylko około 50 kB / s, więc nie nadaje się do dużych plików.

Testowane na Ubuntu (bash, Dash i busybox), FreeBSD i OpenBSD.
 5
Author: Håkon A. Hjortland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-19 06:15:37

W niektórych sytuacjach możesz zmienić RS na inny łańcuch lub znak. W ten sposób \N jest dostępne dla sub / gsub:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

Moc skryptów powłoki polega na tym, że jeśli nie wiesz, jak to zrobić w jeden sposób, możesz to zrobić w inny sposób. I wiele razy masz więcej rzeczy do wzięcia pod uwagę niż zrobić kompleksowe rozwiązanie prostego problemu.

/ Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / .. i wczytuje plik do pamieci, Nie wiem tego, ale wg mnie dziala z jedną linijką w czasie i jest bardzo szybki (nie tak szybki jak niektóre z innych, ale liczy się również czas na napisanie i przetestowanie).

Przetwarzam MB, a nawet GB danych, a jedynym ograniczeniem, jakie znalazłem, jest rozmiar linii.

 5
Author: mor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 08:31:13

Znajduje i zastępuje za pomocą allowing \N

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

Marker

Staje się

# Marker Komentarz

Marker

 5
Author: Proximo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 07:33:03

Możesz użyć xargs - domyślnie zastąpi \n spacją.

Jednakże, to może mieć problemy, jeśli wejście ma jakikolwiek przypadek unterminated quote, np. jeśli znaki cudzysłowu w danej linii nie pasują.

 4
Author: cnst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 15:06:25

Możesz również użyć tej metody

sed 'x;G;1!h;s/\n/ /g;$!d'

Wyjaśnienie

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting next line until the
      last line.

przepływ:
Gdy pierwsza linia get z wejścia jest wykonywana exchange, więc 1 przechodzi do przestrzeni przytrzymującej, a \n do przestrzeni wzorcowej, a następnie dołącza przestrzeń przytrzymującą do przestrzeni wzorcowej, a następnie wykonuje się zastępowanie i usuwa przestrzeń wzorcową.
Podczas wymiany drugiej linii 2 przechodzi do przestrzeni przytrzymującej, a 1 do przestrzeni wzorcowej, a następnie G dodaje przestrzeń przytrzymującą do przestrzeni wzorcowej, następnie h Skopiuj do niego wzór i podstawiaj i usuwaj. Operacja ta jest kontynuowana do momentu osiągnięcia eof, a następnie wypisuje dokładny wynik.

 4
Author: Kalanidhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 19:26:05

Na Mac OS X (przy użyciu FreeBSD sed):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta
 3
Author: bashfu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 10:44:38

Aby usunąć puste linie:

sed -n "s/^$//;t;p;"
 3
Author: kralyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 14:42:25

Użycie Awk:

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"
 3
Author: kralyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 15:15:45

Rozwiązaniem, które szczególnie lubię, jest dodanie całego pliku w przestrzeni przytrzymania i zastąpienie wszystkich nowych linii na końcu pliku:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

Jednak ktoś powiedział mi, że przestrzeń zatrzymania może być skończona w niektórych implementacjach sed.

 3
Author: brandizzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 14:35:10

Zastąp nowe linie dowolnym ciągiem znaków, a także zastąp ostatnią nową linię

Czyste rozwiązania tr mogą zastąpić tylko pojedynczym znakiem, a czyste rozwiązania sed nie zastępują ostatniej nowej linii wejścia. Poniższe rozwiązanie rozwiązuje te problemy i wydaje się być bezpieczne dla danych binarnych (nawet z ustawieniami UTF-8):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

Wynik:

1<br>2<br>3<br>
 3
Author: Håkon A. Hjortland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 14:15:01

To sed wprowadza nowe linie po" normalnym " substytucji. Najpierw przycina znak nowej linii, następnie przetwarza zgodnie z instrukcjami, a następnie wprowadza nową linię.

Używając sed możesz zastąpić "koniec" linii (nie znak nowej linii) po przycięciu, wybranym ciągiem znaków dla każdej linii wejściowej; ale sed wyświetli różne linie. Na przykład, załóżmy, że chcesz zastąpić "koniec linii" przez "= = = " (bardziej ogólne niż zastąpienie pojedynczą spacją):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

Aby zastąpić znak nowej linii ciągiem znaków, możesz, nieefektywnie, użyć tr , Jak wskazano wcześniej, aby zastąpić znaki nowej linii znakiem "Special char", a następnie użyć sed, Aby zastąpić ten znak specjalny ciągiem znaków, który chcesz.

Na przykład:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$
 3
Author: Robert Vila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-16 05:47:53

Inny GNU sed metoda, prawie taka sama jak Zsolt Botykai's answer , but this uses sed' s less-frequently used y (Transliteracja ) polecenie, które zapisuje jeden bajt kodu (końcowe g):

sed ':a;N;$!ba;y/\n/ /'

Można by mieć nadzieję, że y będzie działać szybciej niż s, (być może przy tr prędkościach, 20x szybciej), ale w GNU sed v4.2.2 y jest o 4% wolniej niż s.


Bardziej przenośny BSD sed Wersja:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'
 3
Author: agc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 13:39:31