我有一个输出以下文本的脚本。这是一个输出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'
答案1
sed
不会(很容易)工作,因为它一次只运行一行;你可以做到这一点,但这需要将整个输入复制到保持缓冲区中
tr
实际上应该按照您粘贴的方式工作;你确定换行符是\n
s 吗?您可以通过删除换行符而不是将它们转换为空格来简化它:
tr -d '\n'
答案2
除此之外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
答案3
用于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
)
答案4
要删除换行符,它是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' -