파이프 입력(파일이 아니라 파이프)에서 패턴을 새 줄로 바꿉니다.

파이프 입력(파일이 아니라 파이프)에서 패턴을 새 줄로 바꿉니다.

netcat을 사용하여 얻은 입력 스트림이 있습니다. 입력 스트림에 개행 문자가 포함되어 있지 않습니다. 대신 줄 바꿈을 위해 4개의 공백이 있어야 합니다. 따라서 4개의 공백을 모두 개행 문자로 바꿔야 합니다.

사용해 보았습니다

netcat xxxx | sed 's/    /\n/g' | myscript.sh

그래서 sed나 awk를 통해 파이핑을 시도했지만 성공하지 못했습니다. 두 명령 모두 대체를 처리하기 전에 입력 스트림에서 개행 문자를 무기한 기다리는 것으로 보입니다. sed와 awk는 모두 파일에서 완벽하게 작동하지만 파이프라인의 일부일 때는 그렇지 않습니다. 노력 중이야 어크

RS='    '

또는

-F'    '

그러나 그것도 작동하지 않았습니다. sed와 awk 모두 입력 파일에서 실제 개행 문자를 찾을 때까지 모든 것을 먹는 것처럼 보이지만 결코 발생하지 않습니다.

답변1

예, 버퍼링 때문에 죽고 있습니다. sed가 읽으려고 합니다.철사.

이는 도움이 될 수 있습니다:

input=""
netcat xxx | while IFS= read -r -d "" -n 1 char; do
    input+=$char
    if [[ $input == *"    " ]]; then
        echo "${input%    }"
        output=""
    fi
done | yourscript.sh

그러나 두 번째 측면에서는더 나은 방법: 입력 레코드 구분 기호를 4개의 공백으로 정의하고 각 레코드를 인쇄합니다(다중 문자 RS는 GNU awk 기능입니다)

netcat xxx | gawk -v RS="    " 1 | yourscript.sh

끝이 없는 이 한 줄의 입력은 bash 함수를 사용하여 시뮬레이션할 수 있습니다.

netcat() { while true; do printf '%d    ' $RANDOM; done; }

관련 정보