Удалить символы конца строки из стандартного вывода? Несколько строк в одну строку

14

У меня есть скрипт, который выводит следующий текст. Это вывод модема 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

Как я могу удалить символ конца строки для каждой строки? Я бы хотел, чтобы результат выглядел примерно так (Да, это уродливо):

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 

Я пробовал некоторые решения, как это, но они не работают:

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

Я также пытался использовать tr. Я ожидал, что следующая команда заменит каждый символ новой строки пробелом. Это займет несколько строк и объединит их в одну длинную строку. Вместо этого отображается только последняя строка вывода. Кажется, перезаписать каждую последующую строку следующей строкой вывода.

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

Обновление :

При дальнейшем рассмотрении похоже, что каждой строке предшествует символ возврата. Это проявляется как ^Mпри использовании less. Итак, я добавил два trзаявления. Один для удаления символов новой строки, другой для удаления символа возврата.

./script | | tr -d '\n' | tr -d '\r'
Стефан Ласевский
источник

Ответы:

18

sedне будет работать (легко), потому что он работает по строкам по одному; Вы можете сделать это, но это будет включать в себя копирование всего ввода в буфер хранения

trна самом деле должно работать так, как вы его вставили; Вы уверены, что новые строки \nс? Вы можете немного упростить его, удалив символы новой строки вместо преобразования их в пробелы:

tr -d '\n'
Михаил Мрозек
источник
И то tr '\n' ' 'и другое tr -d '\n' обернет линию странным образом. Я обновил свой вопрос, чтобы показать результаты. Так что, может быть, мне нужно использовать tr, но мне просто нужно выяснить, как использовать его правильно.
Стефан Ласевский
Не могли бы вы рассказать, что в этом странного? Причина, по которой ваша подсказка заканчивается в той же строке, что и последняя строка вывода, заключается именно в том, что вы удалили '\ n' в конце строки. Если вы опишите конечный результат, к которому вы стремитесь, я уверен, что кто-то придумает подходящий фильтр.
Стивен Д
Хорошо, я думаю, я мог бы быть более ясным. Я надеялся обернуть эти несколько строк в одну строку. Я хотел бы tr '\n' ' 'удалить символ новой строки и заменить его пробелом, и, следовательно, иметь одну длинную строку.
Стефан Ласевский
@Steven: я обновил свой вопрос, чтобы обсудить, что я ожидал увидеть, и что на самом деле было выведено на экран.
Стефан Ласевский
Хм. Если ваш вывод не заканчивается \ n, это должно дать ожидаемый результат. Вы пытались скопировать его в файл, а затем подтвердить, что перенос строки не является тем, что ваш термин делает для вас?
Стивен Д
5

кроме того tr, некоторые другие методы, которые вы можете использовать

AWK

awk '1' ORS= file

ракушка

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

СЭД

sed -e ':a' -e 'N;s/\n/ /;ba' file
user1606
источник
0

Используется tr -s '\n'для замены последовательностей повторяющихся символов новой строки на единственное вхождение новой строки.

Пример:

>>> 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

(см. man tr)

Franck
источник
0

Чтобы удалить символы новой строки, это tr -d '\n' < file. Тем не менее, чтобы объединить все линии, это так paste -sd '\0' file.

tr -d '\n' производит нетекстовый вывод, поскольку он не завершает одну строку символом новой строки.

Чтобы удалить все символы CR, вы можете сделать:

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

Чтобы удалить только символы CR, которые находятся в конце строк:

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

Или используйте awkдля всего:

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

Или используйте dos2unix(который удалит эти конечные CR, а также исправит некоторые другие проблемы с текстовыми файлами из ОС Microsoft):

 dos2unix < file | paste -sd '\0' -
Стефан Шазелас
источник