한 줄을 여러 번 분해하고 각 단계 후에 다시 조립하지만 각 명령은 출력에 새 줄을 추가합니다.
기본적으로 다음 명령은 다음과 같습니다.
h
s#(^.*?)(\[\{.*$)#\1#p
g
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#ep
g
s#(^.*?\}\])(.*)$#\2#p
z
그러나 원래 줄은 sed 다음에 세 줄을 생성합니다. 각 줄은 /p
내용 뒤에 개행을 추가하기 때문입니다. 이것을 어떻게 피할 수 있습니까? 입력의 한 줄은 출력의 한 줄로 이어져야 합니다.
대신 , 플래그가 있는 파일 에 명령 결과를 쓴 다음 명령으로 읽으려고 /p
시도했지만 파일 내용이 출력에 직접 추가되어 동일한 결과가 나타납니다.s
/w filename
r filename
/p
sed에 -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
참고: 쉘 명령 호출이 단일 파일의 처리 속도 를 몇 분에서 너무 오래 기다리게 하는 실제 차단기(처리에는 여러 단계가 소요됨)라는 사실을 금방 알게 되었습니다 .