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'

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'

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

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)


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' -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.