지정된 네트워크 포트에 연속적인 한 줄의 텍스트를 출력하는 내장 서버를 디버깅하고 있습니다. 스트림 어디에도 개행 문자는 없지만 텍스트 데이터이므로 출력 시 형식을 지정하고 싶습니다. 스트림의 문자를 유효한 개행 문자로 바꾸기 위해 tr(번역)을 사용해 보았지만 항상 개행 문자로 적절하게 대체할 수 있는 유일한 단일 문자를 찾는 것은 불가능했습니다. 내 초기 생각은 sed를 사용하여 2-3 문자 패턴에 줄 바꿈을 추가하는 것이었지만 sed는 줄 기반이고 스트림은 끝없는 단일 줄이므로 sed는 프로세스를 완료하지 않습니다! sed에 대한 비라인 기반 대안이 있습니까?
답변1
fold
목적 은 다음과 같습니다 .
NAME
fold - wrap each input line to fit in specified width
SYNOPSIS
fold [OPTION]... [FILE]...
DESCRIPTION
Wrap input lines in each FILE, writing to standard output.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options
too.
-b, --bytes
count bytes rather than columns
-s, --spaces
break at spaces
-w, --width=WIDTH
use WIDTH columns instead of 80
--help display this help and exit
--version
output version information and exit
위에서 볼 수 있듯이 너비를 기준으로 줄을 축소하여 100개의 문자 줄을 얻습니다.
command_that_reads_from_port | fold -w 100
이는 GNU coreutils의 일부인 표준 프로그램이므로 모든 GNU 시스템에 있어야 합니다.
답변2
해결책은 다음과 같습니다
stdbuf -o0 ncat -ul 51002 | stdbuf -o0 fold | sed "s/\[15/\&\[15/g" -u | stdbuf -o0 tr -d '\n' | tr "&" "\n"
여기서 [15는 앞에 개행 문자를 추가하려는 패턴입니다. 약간의 해결 방법이지만 훌륭하게 작동합니다.
답변3
게시한 답변에 따르면 다중 문자 RS 및 RT에 GNU awk를 사용하면 다음과 같은 내용이 필요할 수 있습니다.
$ printf '%s' 'foo[15bar[15and stuff' |
awk -v RS='[[]15' '{print pRT $0; pRT=RT}'
foo
[15bar
[15and stuff
그러나 샘플 입력/출력이 없으면 이는 추측입니다. awk 스크립트 내의 데이터에 대해 원하는 모든 작업을 수행할 수 있으며, [15
특정 수의 구분된 레코드 또는 특정 문자 수 이후에 데이터 처리를 중지하려면 단순히 개수를 추가하고 종료하면 됩니다. 20 녹음 후 종료:
awk -v RS='[[]15' '{print pRT $0; pRT=RT} NR==20{exit}'
또는 1000자 이후:
awk -v RS='[[]15' '{$0=pRT $0; n+=length(); print; pRT=RT} n==1000{exit}'
아니면 당신이 좋아하는 것.
필요에 따라 stdbuf 섹션을 추가하십시오.