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


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

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)


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' -
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.