sed 출력에서 ​​라인 피드/캐리지 리턴을 피하는 방법은 무엇입니까?

sed 출력에서 ​​라인 피드/캐리지 리턴을 피하는 방법은 무엇입니까?

한 줄을 여러 번 분해하고 각 단계 후에 다시 조립하지만 각 명령은 출력에 새 줄을 추가합니다.

기본적으로 다음 명령은 다음과 같습니다.

h
s#(^.*?)(\[\{.*$)#\1#p
g
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#ep
g
s#(^.*?\}\])(.*)$#\2#p
z

그러나 원래 줄은 sed 다음에 세 줄을 생성합니다. 각 줄은 /p내용 뒤에 개행을 추가하기 때문입니다. 이것을 어떻게 피할 수 있습니까? 입력의 한 줄은 출력의 한 줄로 이어져야 합니다.

대신 , 플래그가 있는 파일 에 명령 결과를 쓴 다음 명령으로 읽으려고 /p시도했지만 파일 내용이 출력에 직접 추가되어 동일한 결과가 나타납니다.s/w filenamer filename

/psed에 -n 명령줄 인수를 추가하려고 했기 때문입니다 .

컨텍스트를 추가하려면 타임스탬프, 요청 URI, 요청 JSON 본문, 요청 헤더로 구성된 로그 HTTP POST 요청을 구문 분석하고 있으며 다음을 사용하려고 합니다.JSON 속성의 통합 정렬.

답변1

귀하의 질문을 올바르게 이해했다면 를 사용하여 tr -d '\n'개행 문자를 제거 할 수 있습니다 sed.

답변2

다음 스크립트를 사용하여 원하는 결과를 얻었습니다.

h
# Extract the first part of the input line and store it as-is
s#(^.*?)(\[\{.*$)#\1#
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the second part of the input line and process it with an external command
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#e
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the third (and final) part of the input line and store it as-is
s#(^.*?\}\])(.*)$#\2#m
H
g
# (2) 
s#^.*$\n##m
# (3)
s#\n##mg

기본적으로 원래 입력을 유지합니다.예비 공간를 사용하여 먼저 복사한 h다음 부분 처리 결과를 누적하여 에 추가합니다.예비 공간(그리고 H). 그래서 교체할 때패턴 공간그리고예비 공간(사용 g) 추가 구성 요소를 제거해야 합니다(명령 (1) 사용).

처리가 끝나면 첫 번째 줄(즉, 원래 입력 줄)을 제거하고(명령 (2) 사용) 이전에 명령으로 추가한 모든 줄 바꿈을 제거하고 H(명령 (3) 사용) 인쇄하기 전에 줄을 효과적으로 다시 어셈블합니다.패턴 공간출력합니다.

sed참고: 쉘 명령 호출이 단일 파일의 처리 속도 를 몇 분에서 너무 오래 기다리게 하는 실제 차단기(처리에는 여러 단계가 소요됨)라는 사실을 금방 알게 되었습니다 .

관련 정보