需要帮助使用sed停止将\ n解释为linux bash脚本中的换行

时间:2018-12-31 11:20:29

标签: regex bash sed

我是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"

有人可以帮忙吗? 谢谢

2 个答案:

答案 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}

工作原理:

  1. echo多行字符串,将其通过管道传递到/dev/stdin
  2. sed找到目标“ INSERT_ORG1_CA_CERT”时,它r引出/dev/stdin并输出内容
  3. 然后 d 删除搜索字符串行(假定不包含其他文本)。

棘手的部分是没有充分记录的 r 命令-sed假设r是以下内容的全部内容 文件名。如果我们尝试'/INSERT_ORG1_CA_CERT/{r /dev/stdin;d}',它将炸毁错误:

unmatched '{'

因为sed会认为文件名实际上是“ / dev / stdin; d}” 。但是错误消息不会抱怨缺少文件,因为sed 从不抱怨缺少r文件名。相反,sed抱怨没有}右括号,因为sed认为}是文件名的一部分。

为避免该错误,我们在其中粘贴了' -e '