我需要在公钥中替换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
... 的空格字符。这[…]
是一个字符类,仅匹配多个字符之一。由于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
是\r
回车符(GNUsed
这样做,但sed
OpenBSD 不这样做)。
该sed
脚本首先用反斜杠替换当前行末尾的回车符,并将其附加到保留空间(第一行将替换保留空间,而不首先向其附加换行符)。当到达最后一行时,交换保留空间并将换行符替换为字符n
,最后的斜杠替换为\n
。
其结果将在末尾有一个换行符(与命令的结果相反tr
)。