从标准输出中删除行尾字符?多行成一行


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'

Answers:


18

sed(一次轻松地)无法工作,因为它一次只能运行一行;您可以这样做,但这将涉及将整个输入复制到保持缓冲区中

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

tr -d '\n'

两者tr '\n' ' 'tr -d '\n' 都会以一种奇怪的方式包装线。我更新了问题以显示结果。因此,也许我需要使用tr,但是我只需要弄清楚如何正确使用它。
Stefan Lasiewski

您能谈谈它的怪异之处吗?您的提示与输出的最后一行最终出现在同一行的原因恰恰是因为您删除了该行末尾的'\ n'。如果您描述了最终的结果,我相信有人会提出适当的过滤条件。
史蒂文D

好吧,我想我可能会更清楚。我希望将这些多行包装为一行。我希望tr '\n' ' '删除换行符并将其替换为空格符,因此会有一条长行。
Stefan Lasiewski,2010年

@Steven:我更新了问题,以讨论我期望看到的内容以及实际打印到屏幕上的内容。
Stefan Lasiewski,2010年

嗯 除非您的输出不以\ n结尾,否则应该可以提供预期的输出。您是否尝试过将其管道传输到文件中,然后确认换行不是您的任期为您准备的工作?
史蒂文D

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' -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.