Usunąć znaki końca linii ze standardowego? Wiele linii w jedną linię

14

Mam skrypt, który wyświetla następujący tekst. Jest to wyjście z modemu Netopia 2210-02 ADSL2 .

ADSL Line State:        Up
ADSL Startup Attempts:  1
ADSL Modulation:        DMT
ADSL Data Path:         Fast
Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0
SNR Margin:                   8.20        9.00 dB
Line Attenuation:            57.50       31.00 dB
Output Power:                17.09       12.34 dBm
Errored Seconds:                 0           0
Loss of Signal:                  0         476
Loss of Frame:                   0           0
CRC Errors:                  57921         416
Data Rate:                    2880        1024

Jak mogę usunąć znak końca linii dla każdej linii? Chciałbym, aby wyjście wyglądało mniej więcej tak (tak, jest brzydkie):

ADSL Line State:        Up ADSL Startup Attempts:  1 ADSL Modulation:        DMT ADSL Data Path:         Fast Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin:                   8.20        9.00 dB Line Attenuation:            57.50       31.00 dB Output Power:                17.09       12.34 dBm Errored Seconds:                 0           0 Loss of Signal:                  0         476 Loss of Frame:                   0           0 CRC Errors:                  57921         416 Data Rate:                    2880        1024 

Próbowałem takich rozwiązań, ale one nie działają:

# (This simply outputs the contents of the script, unmodified)
stefanl@hosta:~/Work/Cacti $ ./script | sed -e 's/$//'

Próbowałem też użyć tr. Oczekiwałem, że następujące polecenie zastąpi każdy znak nowej linii spacją. To wziąłoby wiele linii i połączyłoby je w jedną długą pojedynczą linię. Zamiast tego wyświetla tylko ostatni wiersz wyniku. Wydaje się, że zastępuje każdy kolejny wiersz następnym wierszem wyniku.

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $

Aktualizacja :

Po dalszym badaniu wygląda na to, że każda linia poprzedzona jest znakiem powrotu. To pokazuje, jak ^Mprzy użyciu less. Dodałem więc dwie trwypowiedzi. Jeden, aby usunąć znaki nowego wiersza, jeden, aby usunąć znak powrotu.

./script | | tr -d '\n' | tr -d '\r'
Stefan Lasiewski
źródło

Odpowiedzi:

18

sednie będzie działać (łatwo), ponieważ działa na liniach pojedynczo; możesz to zrobić, ale wymagałoby to skopiowania całego wejścia do bufora wstrzymania

trpowinien działać tak, jak to wkleiłeś; czy jesteś pewien, że nowe linie są \n? Możesz to nieco uprościć, usuwając znaki nowej linii zamiast przekształcać je w spacje:

tr -d '\n'
Michał Mrożek
źródło
Oba tr '\n' ' 'i tr -d '\n' dziwnie zawiną linię. Zaktualizowałem moje pytanie, aby pokazać wyniki. Więc może muszę użyć tr, ale muszę tylko wymyślić, jak prawidłowo używać.
Stefan Lasiewski,
Czy mógłbyś rozwinąć to, co jest w tym dziwnego? Powodem, dla którego twoje zapytanie kończy się w tym samym wierszu co ostatni wiersz wyniku, jest właśnie to, że usunąłeś „\ n” na końcu wiersza. Jeśli opisujesz wynik końcowy, którego szukasz, jestem pewien, że ktoś wymyśli odpowiedni filtr.
Steven D
Ok, chyba mógłbym być bardziej zrozumiały. Miałem nadzieję na zawinięcie tych wielu linii w jedną linię. Spodziewałbym tr '\n' ' 'się usunąć znak nowej linii i zastąpić go spacją, a zatem mam jedną długą linię.
Stefan Lasiewski
@Steven: Zaktualizowałem swoje pytanie, aby omówić to, czego się spodziewałem i co faktycznie wydrukowano na ekranie.
Stefan Lasiewski
Hmm Jeśli twój wynik nie jest zakończony \ n, to powinno dać ci wynik, którego oczekujesz. Czy próbowałeś wpakować go do pliku, a następnie potwierdzić, że zawijanie wierszy nie jest czymś, co robi dla ciebie twój termin?
Steven D
5

poza tym trkilka innych metod, których możesz użyć

awk

awk '1' ORS= file

muszla

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

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file
użytkownik1606
źródło
0

Służy tr -s '\n'do zastępowania sekwencji powtarzających się znaków nowej linii pojedynczym wystąpieniem nowej linii.

Przykład:

>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n"
Squeeze


those



newlines

2z [franck:~] $ 
>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n" | tr -s '\n'
Squeeze
those
newlines

(patrz man tr)

Franck
źródło
0

Aby usunąć znaki nowego wiersza, to tr -d '\n' < file. Jednak aby połączyć wszystkie linie, to jest paste -sd '\0' file.

tr -d '\n' generuje wyjście nietekstowe, ponieważ nie kończy jednego wiersza znakiem nowej linii.

Aby usunąć wszystkie znaki CR, możesz:

tr -d '\r' < file | paste -sd '\0' -

Aby usunąć tylko znaki CR znajdujące się na końcu linii:

CR=$(printf '\r')
sed "s/$CR\$//" < file | paste -sd '\0' -

Lub użyj awkdo wszystkiego:

awk '{gsub(/\r$/, ""); printf "%s", $0} 
     END {if (NR) print ""}' < file

Lub użyj dos2unix(który usunąłby te końcowe CR, a także naprawił niektóre inne problemy z plikami tekstowymi z systemów operacyjnych Microsoft):

 dos2unix < file | paste -sd '\0' -
Stéphane Chazelas
źródło