Loại bỏ các ký tự kết thúc từ thiết bị xuất chuẩn? Nhiều dòng thành một dòng


14

Tôi có một đoạn script xuất ra văn bản sau. Đây là đầu ra từ modem 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

Làm cách nào để xóa ký tự cuối dòng cho mỗi dòng? Tôi muốn đầu ra trông giống như thế này (Vâng, nó xấu xí):

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 

Tôi đã thử một số giải pháp như thế này, nhưng chúng không hoạt động:

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

Tôi cũng đã thử sử dụng tr. Tôi đã mong đợi lệnh sau để thay thế từng ký tự dòng mới bằng ký tự khoảng trắng. Điều này sẽ lấy nhiều dòng và kết hợp chúng thành một dòng dài. Thay vào đó, điều này chỉ hiển thị dòng đầu ra cuối cùng. Nó dường như ghi đè lên mỗi dòng tiếp theo với dòng đầu ra tiếp theo.

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $

Cập nhật :

Khi kiểm tra thêm, có vẻ như mỗi dòng được đi trước bởi một ký tự trở lại. Điều này hiển thị như ^Mkhi sử dụng less. Vì vậy, tôi đã thêm hai trtuyên bố. Một để xóa các ký tự dòng mới, một để xóa ký tự trả về.

./script | | tr -d '\n' | tr -d '\r'

Câu trả lời:


18

sedsẽ không hoạt động (dễ dàng) bởi vì nó hoạt động trên các dòng một lần; bạn có thể làm điều đó, nhưng nó sẽ liên quan đến việc sao chép toàn bộ đầu vào vào bộ đệm giữ

trthực sự nên làm việc theo cách bạn dán nó; bạn có chắc là dòng mới\n s? Bạn có thể đơn giản hóa nó một chút bằng cách xóa các dòng mới thay vì chuyển đổi chúng thành khoảng trắng:

tr -d '\n'

Cả hai tr '\n' ' 'tr -d '\n' sẽ quấn dòng một cách kỳ lạ. Tôi cập nhật câu hỏi của tôi để hiển thị kết quả. Vì vậy, có lẽ tôi cần sử dụng tr, nhưng tôi chỉ cần tìm ra cách sử dụng nó đúng cách.
Stefan Lasiewski

Bạn có thể mở rộng về những gì kỳ lạ về nó? Lý do lời nhắc của bạn kết thúc trên cùng một dòng với dòng đầu ra cuối cùng là vì bạn đã xóa '\ n' ở cuối dòng. Nếu bạn mô tả kết quả cuối cùng mà bạn sẽ thực hiện, tôi chắc chắn ai đó sẽ đưa ra bộ lọc phù hợp.
Steven D

Ok, tôi đoán tôi có thể rõ ràng hơn. Tôi đã hy vọng bọc nhiều dòng này thành một dòng duy nhất. Tôi hy vọng tr '\n' ' 'sẽ loại bỏ ký tự dòng mới và thay thế nó bằng một ký tự khoảng trắng, và do đó có một dòng dài.
Stefan Lasiewski

@Steven: Tôi đã cập nhật câu hỏi của mình để thảo luận về những gì tôi đang mong đợi để xem và những gì thực sự được in ra màn hình.
Stefan Lasiewski

Hừm. Trừ khi đầu ra của bạn không kết thúc với \ n, điều này sẽ cung cấp cho bạn đầu ra mà bạn đang mong đợi. Bạn đã thử chuyển nó thành một tập tin và sau đó xác nhận rằng gói dòng không phải là điều mà thuật ngữ của bạn đang làm cho bạn?
Steven D

5

Ngoài ra tr, một số phương pháp khác bạn có thể sử dụng

ôi

awk '1' ORS= file

vỏ

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

quyến rũ

sed -e ':a' -e 'N;s/\n/ /;ba' file

0

Sử dụng tr -s '\n'để thay thế các chuỗi ký tự dòng mới lặp lại với một lần xuất hiện của dòng mới.

Thí dụ:

>>> 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

(xem man tr)


0

Để loại bỏ các ký tự dòng mới, nó tr -d '\n' < file. Tuy nhiên, để tham gia tất cả các dòng, đó là paste -sd '\0' file.

tr -d '\n' tạo đầu ra không phải là văn bản vì nó không chấm dứt một dòng với một ký tự dòng mới.

Để xóa, tất cả các ký tự CR, bạn có thể làm:

tr -d '\r' < file | paste -sd '\0' -

Để chỉ xóa các ký tự CR ở cuối dòng:

CR=$(printf '\r')
sed "s/$CR\$//" < file | paste -sd '\0' -

Hoặc sử dụng awkcho mọi thứ:

awk '{gsub(/\r$/, ""); printf "%s", $0} 
     END {if (NR) print ""}' < file

Hoặc sử dụng dos2unix(sẽ loại bỏ các CR theo dõi đó và cũng khắc phục một số vấn đề khác với tệp văn bản từ Hệ điều hành Microsoft):

 dos2unix < file | paste -sd '\0' -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.