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실제로 붙여 넣은 방식으로 작동해야합니다. 줄 바꿈이 확실 \n합니까? 줄 바꿈을 공백으로 변환하는 대신 삭제하여 조금 단순화 할 수 있습니다.

tr -d '\n'

모두 tr '\n' ' 'tr -d '\n' 이상한 방법으로 라인을 바꿈됩니다. 결과를 보여주기 위해 질문을 업데이트했습니다. 따라서을 사용해야 할 수도 tr있지만 올바르게 사용하는 방법을 알아야합니다.
Stefan Lasiewski

이상한 점을 확장 해 주시겠습니까? 프롬프트가 마지막 출력 줄과 같은 줄에 끝나는 이유는 줄 끝에서 '\ n'을 제거했기 때문입니다. 당신이 가고있는 최종 결과를 설명한다면, 나는 누군가가 적절한 필터를 만들 것이라고 확신합니다.
Steven D

좋아, 나는 더 분명 할 수 있다고 생각한다. 이 여러 줄을 한 줄로 묶기를 원했습니다. 나는 기대 tr '\n' ' '개행 문자를 제거하고 공백 문자로 교체, 따라서 하나 개의 긴 라인을 가지고.
Stefan Lasiewski

@Steven : 내가 볼 것으로 예상되는 내용과 실제로 화면에 인쇄 된 내용을 논의하기 위해 질문을 업데이트했습니다.
Stefan Lasiewski

흠. 출력이 \ n으로 끝나지 않는 한, 예상 한 출력을 제공해야합니다. 파일로 파일을 파이핑 한 다음 줄 바꿈이 용어가 당신을 위해하고있는 것이 아닌지 확인 했습니까?
Steven D

5

게다가 tr, 당신이 사용할 수있는 다른 방법들

어 wk

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 OS의 텍스트 파일과 관련된 다른 문제도 해결합니다).

 dos2unix < file | paste -sd '\0' -
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.