sed/awk 2 つのパターンマッチから改行文字を削除する

sed/awk 2 つのパターンマッチから改行文字を削除する

.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

1つの方法は次のとおりですsed

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

このアプローチは、タスクを直接実行します。

  • 行で始まる場合は、---コードブロックを入力してください。
  • コードブロック内に次のループタグを作成します。1
  • 現在の行が最後の行でない場合は、N入力の分岐線を読みます。$
  • \n改行文字をスペースに置き換える
  • 次の行が終わったらループを---中止し!、そうでなければループを再開します。b1

答え2

キーラインも1本の長いラインで収集する必要があるとします。

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

これは4つの範囲を使用します。まずed、ファイルの末尾から始めて後方に検索し、最初の範囲の各行の末尾にスペースを追加してから、2番目の範囲(実際には最初の範囲に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 

関連情報