从标准输出中删除行尾字符?多行合并为一行

Ste*_*ski 16 shell shell-script

我有一个输出以下文本的脚本。这是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
Run Code Online (Sandbox Code Playgroud)

如何删除每行的行尾字符?我希望输出看起来像这样(是的,它很丑):

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 
Run Code Online (Sandbox Code Playgroud)

我尝试了一些这样的解决方案,但它们不起作用:

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

我也尝试使用tr. 我期待以下命令用空格字符替换每个换行符。这将采用多行并将它们组合成一个长的单行。相反,这仅显示输出的最后一行。它似乎用下一行输出覆盖了每个后续行。

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $
Run Code Online (Sandbox Code Playgroud)

更新

经过进一步检查,看起来每一行前面都有一个返回字符。这显示为^M使用less. 所以,我添加了两个tr语句。一是删除换行符,一是删除回车符。

./script | | tr -d '\n' | tr -d '\r'
Run Code Online (Sandbox Code Playgroud)

Mic*_*zek 21

sed不会(很容易)工作,因为它一次只在一行上运行;你可以这样做,但它会涉及将整个输入复制到保持缓冲区中

tr实际上应该按照您粘贴的方式工作;你确定换行符是\ns 吗?您可以通过删除换行符而不是将它们转换为空格来简化它:

tr -d '\n'
Run Code Online (Sandbox Code Playgroud)


use*_*606 6

此外tr,您还可以使用其他一些方法

awk

awk '1' ORS= file
Run Code Online (Sandbox Code Playgroud)

贝壳

while read -r line; do printf "%s " "$line"; done <file
Run Code Online (Sandbox Code Playgroud)

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file
Run Code Online (Sandbox Code Playgroud)