如何用公钥中的新行替换 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

您的正则表达式无法按预期工作。它匹配后面没有PorUB... 的空格字符。这[…]是一个字符类,仅匹配多个字符之一。由于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\r回车符(GNUsed这样做,但sedOpenBSD 不这样做)。

sed脚本首先用反斜杠替换当前行末尾的回车符,并将其附加到保留空间(第一行将替换保留空间,而不首先向其附加换行符)。当到达最后一行时,交换保留空间并将换行符替换为字符n,最后的斜杠替换为\n

其结果将在末尾有一个换行符(与命令的结果相反tr)。

相关内容