sed/awk 删除两个模式匹配的换行符

Fad*_*adi 5 sed awk text-processing

我有一个 .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-----
Run Code Online (Sandbox Code Playgroud)

我显然需要像:

-----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-----
Run Code Online (Sandbox Code Playgroud)

我如何使用awk或来做到这一点sed

我在网上找到的所有教程都展示了如何针对整个文本或一种aaaabbbaaacccc我觉得令人困惑的模式来做这件事。

我试过这样的事情:

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

但那失败了。

我不知道这是否重要,但我正在docker 容器中的 shell#!/bin/sh脚本中执行此操作python:3.5-alpine

任何帮助是极大的赞赏。

cuo*_*glm 12

一种方式sed

sed -e '/^---/ {
  :1
  $!N
  s/\n/ /
  /---$/!b1
}' <file
Run Code Online (Sandbox Code Playgroud)

这种方法可以直接完成工作:

  • 如果行以 开头---,则输入代码块
  • 在代码块中,我们创建了一个名为的循环标签 1
  • N如果当前行不是最后一行,我们读取输入的 ext 行$
  • 换行符替换\n用空格
  • 如果下一行以 结束---,则中断!循环,否则重新开始循环b1