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
正規表現が期待どおりに機能しません。後にP
orU
または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
リテラル文字列に簡単に置き換えることができます。\n
tr
$ 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はそうではありません)。\r
sed
sed
スクリプトsed
は、最初に現在行の末尾にあるキャリッジリターン文字をバックスラッシュに置き換えて、それを予約済みスペースに追加します(最初の行は、改行文字を最初に追加せずに予約済みスペースを置き換えます)。最後の行に達すると、スワップはスペースを保持し、改行を文字に置き換え、最後のn
スラッシュを\n
。
結果には末尾に改行文字があります(コマンド結果と反対tr
)。