我是Linux和任何bash脚本的新手,并遇到以下问题:
我有这个密钥:
-----BEGIN CERTIFICATE-----\n
MIICSTCCAfCgAwIBAgIRAMsLZqD4PavC7NJz7+5ld+EwCgYIKoZIzj0EAwIwdjEL\n
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\n
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\n
c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgxMjMxMTA1ODA5WhcNMjgxMjI4MTA1\n
ODA5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\n
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G\n
A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\n
AwEHA0IABEbH7l3CiqLA4N4wgfilYgyEuxDrMAqDX6BrFOfWhymNosjh5FlJDHtN\n
GPDKhjtrI6e1q0NC0l6wh9h9TrBn7N2jXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV\n
HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIH7OaekSLJda\n
S0yuV9PCsuasGTt/+/35aVBXTVbII2rCMAoGCCqGSM49BAMCA0cAMEQCIEd+YP/6\n
tCzG/LueYTEio8ApQSyz94ju07pmc3LZJDKBAiALu66LKhOpKhogY9XEFg4TScOt\n
el4dC6OnMMTmRsEtoA==\n-----END CERTIFICATE-----\n
保存在文件$replacementOrg1
中(该文件的路径)。
现在,我想用此证书替换模板$file "INSERT_ORG1_CA_CERT"
并将其保存在$org1
中。但是我需要保留“ \ n”字符。
结果应保留\ n并将其写入一行。
我已经尝试过:
sed -e "s@INSERT_ORG1_CA_CERT@$(cat $replacementOrg1)@g" $file > $org1
但是它将“ \ n”解释为新行。
因此最终输出应如下所示,1行中包含1个字符串:
"-----BEGIN CERTIFICATE-----\nMIICSTCCAfCgAwIBAgIRAMsLZqD4PavC7NJz7+5ld+EwCgYIKoZIzj0EAwIw djEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\nc2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgxMjMxMTA1ODA5WhcNMjgxMjI4MTA1\nODA5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G\nA1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEbH7l3CiqLA4N4wgfilYgyEuxDrMAqDX6BrFOfWhymNosjh5FlJDHtN\nGPDKhjtrI6e1q0NC0l6wh9h9TrBn7N2jXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV\nHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIH7OaekSLJda\nS0yuV9PCsuasGTt/+/35aVBXTVbII2rCMAoGCCqGSM49BAMCA0cAMEQCIEd+YP/6\ntCzG/LueYTEio8ApQSyz94ju07pmc3LZJDKBAiALu66LKhOpKhogY9XEFg4TScOt\n
el4dC6OnMMTmRsEtoA==\n-----END CERTIFICATE-----\n"
有人可以帮忙吗? 谢谢
答案 0 :(得分:0)
那不是有效的密钥。某人所做的就是换行符的“半编码”(我不知道更好的术语)-他们在每个换行符之前添加了文字字符串“ \ n”。您很可能想要的是 没有“ \ n”字符串的原始键或一个单独的行字符串,其中的每个换行符已被替换 “ \ n”。
使用原始值,您可以改用replace
-它支持替换值中的换行符:
$ replace foo $'foo\nbar' <<< $'x\nfoo\ny'
x
foo
bar
y
您的情况应仅为replace 'INSERT_ORG1_CA_CERT' "$(< $replacementOrg1)" "$file" > "$org1"
。
答案 1 :(得分:0)
s
ubstitute 命令对于多行替换字符串不是很好。但是我们可以使用 GNU sed
的 r
ead 命令来解决
echo "${replacementOrg1}" |
sed -e '/INSERT_ORG1_CA_CERT/{r /dev/stdin' -e ';d}' ${file} > ${org1}
工作原理:
echo
多行字符串,将其通过管道传递到/dev/stdin
。 sed
找到目标“ INSERT_ORG1_CA_CERT
”时,它r
引出/dev/stdin
并输出内容d
删除搜索字符串行(假定不包含其他文本)。棘手的部分是没有充分记录的 r
命令-sed
假设r
是以下内容的全部内容 文件名。如果我们尝试'/INSERT_ORG1_CA_CERT/{r /dev/stdin;d}'
,它将炸毁错误:
unmatched '{'
因为sed
会认为文件名实际上是“ / dev / stdin; d}” 。但是错误消息不会抱怨缺少文件,因为sed
从不抱怨缺少r
文件名。相反,sed
抱怨没有}
右括号,因为sed
认为}
是文件名的一部分。
为避免该错误,我们在其中粘贴了' -e '
。