CLRFを公開鍵の新しい行に置き換える方法

CLRFを公開鍵の新しい行に置き換える方法

CLRF単一の文字列になるように公開鍵を変更する必要があります。\n

入力する:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvam/SXoPt4YccVuh1Pj/
GmVc/43Y58Weell9U8yIOzqHxWoDFwjRTAtZceVg7SY17ex5AsFDT+4pf46GXa7A
5Jd4u0VlCAC06GKkz0Dvfh4ETIfZXAwXhbvWUm1IgoERG46DAwIgseHe2bRhC56E
9KkVzbuivAan5vvOuKnZ9DkSKCCGpUo/UQfImbkFzNHGb9NPivvHf19pXio7vM7E
DmP1GYEhVUtRgUoUfNKqEKUoO3uueYMLUwL9ePjnNdg3chpneBihFPd0317FAc8n
0TibwVUR2iJrH5fEUNCczfnydQ2p5hKxvhYjswAe+PHktmlhbnmeBo16oUAuowxp
6wIDAQAB
-----END PUBLIC KEY-----

私が試したことは次のとおりです。

PUB_KEY=$(cat keyfile)
PUB_KEY=$(echo $PUB_KEY | sed 's/ [^PUBLIC KEY]/\\n/g')

出力:

-----BEGIN PUBLIC KEY-----\nIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvam/SXoPt4YccVuh1Pj/\nmVc/43Y58Weell9U8yIOzqHxWoDFwjRTAtZceVg7SY17ex5AsFDT+4pf46GXa7A\nJd4u0VlCAC06GKkz0Dvfh4ETIfZXAwXhbvWUm1IgoERG46DAwIgseHe2bRhC56E\nKkVzbuivAan5vvOuKnZ9DkSKCCGpUo/UQfImbkFzNHGb9NPivvHf19pXio7vM7E\nmP1GYEhVUtRgUoUfNKqEKUoO3uueYMLUwL9ePjnNdg3chpneBihFPd0317FAc8n\nTibwVUR2iJrH5fEUNCczfnydQ2p5hKxvhYjswAe+PHktmlhbnmeBo16oUAuowxp\nwIDAQAB\n----END PUBLIC KEY-----

しかし、最初の文字「M」が削除され、1つのスペースが置き換えられないなど、出力にはいくつかの問題があります。

答え1

正規表現が期待どおりに機能しません。後にPorUまたはB... が続かない空白文字と一致します。[…]複数の文字のうちの1つだけが一致する文字クラスです。M文字クラスにないため、文字列から欠落している他の文字のように削除されます。

GNUを使用すると、sedすべての改行をリテラルに変更し、行末\nの最後のリテラルを削除できます。\n

PUB_KEY=$(sed -z 's/\n/\\n/g;s/\\n$//' keyfile)

今、文字列は改行文字で終わりませんが、それがあなたが望むものだと思います。

答え2

より良いアプローチは、改行を印刷できない文字に変換してから「\ n」に置き換えることです。

SOH=$(echo -en "\001")
PUB_KEY=$(cat keyfile|tr -d '\r'|tr '\n' "$SOH"|sed "s/$SOH/\\\\n/g"|sed 's/\\n$//')

SOH = SOH印刷できないASCII文字
の後は、改行文字が印刷できないSOH文字に変換され、エスケープされた改行文字「\ n」に戻ります。

答え3

ファイルが行末のあるDOSテキストファイルの場合は、次のように\r\nリテラル文字列に簡単に置き換えることができます。\ntr

$ tr '\r\n' '\\n' <keyfile
-----BEGIN PUBLIC KEY-----\nMIIBIjANBg...etc...\n6wIDAQAB\n-----END PUBLIC KEY-----\n

(出力の末尾に改行文字はありません)

引数の組み合わせは、tr各キャリッジリターン(\r)文字を文字\(エスケープする必要があります)に置き換え、各改行(\n)文字を文字に置き換えますn


他の人が指摘したように、あなたの命令は

sed 's/ [^PUBLIC KEY]/\\n/g'

部分的に「セットにない単一文字(および空白文字)」のため、改行文字の置き換えは\n機能しません。[^PUBLIC KEY]BCEIKLPUY

これを行うには、sed次のようにします。

sed -n 's/\r$/\\/; 1{ h; d; }; H; ${ x; y/\n/n/; s/\\$/&n/; p; }' keyfile

これはキャリッジリターンを使用しているsedと仮定します(GNUはこれを行いますが、OpenBSDはそうではありません)。\rsedsed

スクリプトsedは、最初に現在行の末尾にあるキャリッジリターン文字をバックスラッシュに置き換えて、それを予約済みスペースに追加します(最初の行は、改行文字を最初に追加せずに予約済みスペースを置き換えます)。最後の行に達すると、スワップはスペースを保持し、改行を文字に置き換え、最後のnスラッシュを\n

結果には末尾に改行文字があります(コマンド結果と反対tr)。

関連情報