Видалити символи кінця рядка з stdout? Кілька ліній в одну лінію


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насправді має працювати так, як ви його вставили; ви впевнені, що нові строки є \ns? Ви можете трохи спростити його, видаливши нові рядки, а не перетворюючи їх у пробіли:

tr -d '\n'

І те, tr '\n' ' 'і tr -d '\n' оберне лінію дивно. Я оновив своє запитання, щоб показати результати. Отже, можливо, мені потрібно користуватися tr, але мені просто потрібно розібратися, як правильно ним користуватися.
Стефан Ласєвський

Чи можете ви розширити, що дивного в цьому? Причина, що ваш запит закінчується в тому ж рядку, що і останній рядок виводу, саме тому, що ви видалили \ \ n 'в кінці рядка. Якщо ви опишете кінцевий результат, до якого ви збираєтеся, я впевнений, що хтось придумає відповідний фільтр.
Стівен D

Гаразд, я думаю, я міг би бути більш зрозумілим. Я сподівався згорнути ці кілька рядків в одну лінію. Я очікував tr '\n' ' 'би видалити символ нового рядка та замінити його символом пробілу, а тому матиму один довгий рядок.
Стефан Ласєвський

@Steven: Я оновив своє запитання, щоб обговорити, що я очікував побачити і що насправді було надруковано на екрані.
Стефан Ласєвський

Хм. Якщо ваш вихід не закінчився \ n, це повинно дати вам результат, який ви очікуєте. Ви спробували скопіювати його у файл, а потім підтвердити, що обгортання рядків - це не те, що ваш термін робить для вас?
Стівен Д

5

крім того tr, деякі інші методи, які ви можете використовувати

awk

awk '1' ORS= file

оболонки

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

sed

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.