在shell中,我有一个存储私钥的变量,但原始私钥中的每个换行符现在都被替换为空格,因此该变量如下所示:
PK="-----BEGIN RSA PRIVATE KEY----- aaa bbb ccc ... zzz -----END RSA PRIVATE KEY-----"
现在我需要将字符串重定向到文件,我需要用换行符替换空格。但是如果我只是运行echo $PK | tr " " "\n" > key
,BEGIN RSA PRIVATE KEY
和END RSA PRIVATE KEY
中的空格也会被换行替换,所以我得到一个奇怪的文件:
-----BEGIN
RSA
PRIVATE
KEY-----
aaa
bbb
ccc
...
zzz
-----END
RSA
PRIVATE
KEY-----
所以我的问题是如何用密钥体中的换行替换空格并保持-----
内的空间不变。我期望得到的是:
-----BEGIN RSA PRIVATE KEY-----
aaa
bbb
ccc
...
zzz
-----END RSA PRIVATE KEY-----
答案 0 :(得分:2)
使用gnu-awk
,您可以执行此操作:
awk -v RS='-+(BEGIN|END) RSA PRIVATE KEY-+' '{
gsub(/ +/, "\n"); ORS=RT} 1' <<< "$PK"
-----BEGIN RSA PRIVATE KEY-----
aaa
bbb
ccc
...
zzz
-----END RSA PRIVATE KEY-----
-v RS='-+(BEGIN|END) RSA PRIVATE KEY-+'
我们将输入记录分隔符设置为BEGIN
或END
个标记。gsub
我们用主体中的换行替换所有空格ORS=RT
我们将页眉和页脚放回输出中。替代gnu sed
解决方案:
sed -E 's/(-+(BEGIN|END) RSA PRIVATE KEY-+) *| +/\1\n/g' <<< "$PK"
-----BEGIN RSA PRIVATE KEY-----
aaa
bbb
ccc
...
zzz
-----END RSA PRIVATE KEY-----
答案 1 :(得分:2)
虽然这不是您正在寻找的完全答案,但我认为这是真正尝试做的事情:
要捕获变量中的私钥,请执行以下操作:
PK="$(cat ~/.id_rsa)" # or whatever command you're getting the key from
然后,将其转储到文件中:
echo "$PK" > key # notice the additional quotes
echo
返回变量时的附加引号可保留输入中捕获的换行符。无需sed
/ awk
/ tr
魔法。