sed/awk 두 패턴 일치에서 개행 문자 제거

sed/awk 두 패턴 일치에서 개행 문자 제거

.pem 파일이 있고 일부 형식을 지정하면 다음과 같습니다.

-----BEGIN
RSA
PRIVATE
KEY-----
MIIEogIBAAKCAQEAoK3D4mMIRnzPaYqHidgpBnDDzLlcYYd0GoB0pQGyGSHDW7KO3K+VeJP90GhE
ZTEWJLp2N5DR/KT+5Vg7cgdx/GCCrnlbW0McP/IvkYAuWCgbzoXH9eE+kDRtAmurBYCk7OTOwQ26
..........................LONG LONG LONG KEY................................
QRRLFsXua9spUh0yPd163IZStKZMhZBPJfMaqbi1WF+j21DdYyS0qpaZQRjFzRLvGuXeGLZG/COD
ip10XRJMMXY0m14bqOTcqKTya/5PTJIjDWC22+soIjLy0ZjWKo9n05Oal2t4q35kbos=
-----END
RSA
PRIVATE
KEY-----

나는 분명히 이것이 필요합니다 :

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAoK3D4mMIRnzPaYqHidgpBnDDzLlcYYd0GoB0pQGyGSHDW7KO3K+VeJP90GhE
ZTEWJLp2N5DR/KT+5Vg7cgdx/GCCrnlbW0McP/IvkYAuWCgbzoXH9eE+kDRtAmurBYCk7OTOwQ26
..........................LONG LONG LONG KEY................................
QRRLFsXua9spUh0yPd163IZStKZMhZBPJfMaqbi1WF+j21DdYyS0qpaZQRjFzRLvGuXeGLZG/COD
ip10XRJMMXY0m14bqOTcqKTya/5PTJIjDWC22+soIjLy0ZjWKo9n05Oal2t4q35kbos=
-----END RSA PRIVATE KEY-----

awk또는 을 사용하여 이 작업을 어떻게 수행할 수 있습니까 sed?

온라인에서 찾은 모든 튜토리얼은 aaaabbbaaacccc전체 텍스트나 혼란스러운 패턴에 대해 작업하는 방법을 보여줍니다.

나는 다음과 같은 것을 시도했습니다 :

tr ' ' '\n' < test.pem  | awk '/BEGIN\nRSA\nPRIVATE\n$/ { printf("%s\t", $0); next } 1' > test-format.pem

그러나 그것은 실패했습니다.

이것이 중요한지는 모르겠지만 docker 컨테이너 #!/bin/sh내부의 쉘 스크립트에서 이 작업을 수행하고 있습니다 python:3.5-alpine.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

한 가지 방법은 다음과 같습니다 sed.

sed -e '/^---/ {
  :1
  $!N
  s/\n/ /
  /---$/!b1
}' <file

이 접근 방식은 작업을 직접 수행합니다.

  • 줄이 로 시작하는 경우 ---코드 블록을 입력하세요.
  • 코드 블록 내에서 다음과 같은 루프 태그를 만듭니다.1
  • 현재 라인이 마지막 라인이 아니면 N입력의 분기 라인을 읽습니다.$
  • \n개행 문자를 공백으로 바꾸기
  • 다음 줄이 끝나면 루프를 ---중단하고 !, 그렇지 않으면 루프를 다시 시작합니다.b1

답변2

키 라인도 하나의 긴 라인으로 수집되어야 한다고 가정합니다.

sed '
    :a
    N
    /\n-\|-\n/{
        P
        D
    }
    s/\n/ /
    ta
    ' file

답변3

여기 또 다른 것이 있습니다 sed:

sed '/^---/,/---$/{H;/^---/h;/---$/!d;x;s/\n/ /g;}' infile

이는 범위 및 보유 버퍼를 사용합니다. 범위의 각 줄을 저장 버퍼에 추가하고, 범위의 시작이면 덮어쓰고, 줄이 범위의 끝이 아니면 줄을 삭제하고, 그렇지 않으면 버퍼를 교체하고 모든 줄 바꿈을 바꿉니다. 공백이 있는 .
다른 접근 방식도 있습니다 ed.

ed -s infile <<\IN
?^---?,.-s/$/ /
?^---?,$j
1,/---$/-s/$/ /
1,/---$/j
w
q
IN

이것은 네 가지 범위를 사용합니다. 먼저 ed파일 끝에서 시작하여 뒤로 검색하고 첫 번째 범위의 각 줄 끝에 공백을 추가한 다음 두 번째 범위(실제로 첫 번째 범위에 1을 더한 값)의 줄을 연결합니다. 더 많은 줄); 그런 다음 동일한 작업을 수행하지만 파일의 시작 부분에서 시작됩니다.

답변4

의견에서 요청한 Posix 버전:

#!/bin/sh
jump=1

while IFS= read -r lin; do

  case $lin in 
    ----*)
        jump=0
    ;;
    *----)
        jump=1
    ;;
  esac

  if [ "$jump" = "1" ]; then 
        printf '%s\n' "$lin" 
  else
        printf '%s' "$lin "
  fi

done <"$1"

불러라:

./script file.txt >thedest.txt 

관련 정보