Zamień wszystkie znaki nowej linii na spację oprócz ostatniej

38

Jak mogę zastąpić wszystkie nowe linie spacją oprócz ostatniej nowej linii. Mogę zastąpić wszystkie znaki nowej linii spacją, trale jak mogę to zrobić z pewnymi wyjątkami?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

42

Możesz użyć paste -s -d ' ' file.txt:

$ cat file.txt
one line
another line
third line
fourth line

$ paste -s -d ' ' file.txt 
one line another line third line fourth line
grebneke
źródło
1
Fajne! -sI -dopcji wydaje się stworzony do tej sprawy.
mkc
10

Możesz użyć, traby zastąpić wszystkie znaki nowej linii spacją, przekazać dane wyjściowe sedi zamienić ostatnią spację z powrotem na nową linię:

tr '\n' ' ' < afile.txt | sed '$s/ $/\n/'
mkc
źródło
5

Ponowne wdrożenie pomysłu vonbranda w Perlu, pod warunkiem, że plik jest wystarczająco mały:

perl -p00e 's/\n(?!\Z)/ /g' your_file
Joseph R.
źródło
+1, ponieważ ta metoda działa w przypadku zamiany znaków wielobajtowych (w przeciwieństwie do wklejania GNU)
myrdd
-1

Coś takiego sed -e 's;\n\(.\); \1;'powinno zrobić ...

vonbrand
źródło
-1

To zadziałało dla mnie.

tr '\n' ' ' < file_with_new_line   | sed 's/\ $//g' > file_with_space
Abhijit
źródło
Spowoduje to również usunięcie ostatniej nowej linii.
terdon
Nie sądzę, działa dobrze. Naprawdę tego próbowałeś ???
Abhijit
Tak, mam. Czy ty? Twoje trpolecenie zastępuje wszystkie znaki nowej linii spacjami, a twoje sedpolecenie usuwa ostatnią spację. Powoduje to, że plik nie ma ostatniej nowej linii, więc nie jest to pytanie, o które pyta. Nawiasem mówiąc, nie ma sensu int używając gw sedpoleceniu. Ponieważ używasz $, może pasować tylko na końcu, nie gma sensu. Nie musisz też uciekać w przestrzeń, `` nie ma znaczenia.
terdon