표준 출력에서 ​​줄 끝 문자를 제거하시겠습니까? 여러 줄을 한 줄로 병합

표준 출력에서 ​​줄 끝 문자를 제거하시겠습니까? 여러 줄을 한 줄로 병합

다음 텍스트를 출력하는 스크립트가 있습니다. 이는 출력입니다.네토피아 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실제로 붙여넣은 방식으로 작동합니다. 줄바꿈이 \ns인지 확실합니까? 줄 바꿈을 공백으로 변환하는 대신 제거하여 단순화할 수 있습니다.

tr -d '\n'

답변2

그 외에도 tr다른 방법을 사용할 수도 있습니다.

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

관련 정보