다음 텍스트를 출력하는 스크립트가 있습니다. 이는 출력입니다.네토피아 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 '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' -