用换行符替换空格,除了由特殊字符包装的空格

时间:2018-04-25 07:15:31

标签: linux bash shell

在shell中,我有一个存储私钥的变量,但原始私钥中的每个换行符现在都被替换为空格,因此该变量如下所示:

PK="-----BEGIN RSA PRIVATE KEY----- aaa bbb ccc ... zzz -----END RSA PRIVATE KEY-----"

现在我需要将字符串重定向到文件,我需要用换行符替换空格。但是如果我只是运行echo $PK | tr " " "\n" > keyBEGIN RSA PRIVATE KEYEND 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-----

2 个答案:

答案 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-+'我们将输入记录分隔符设置为BEGINEND个标记。
  • 使用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魔法。

参考:Capturing multiple line output into a Bash variable