从另一个包含换行符的文件读取时使用gsed replacement命令

从另一个包含换行符的文件读取时使用gsed replacement命令,sed,Sed,这有点奇怪。在将云配置文件推送到服务器之前,我使用gsed编辑云配置文件。由于某种原因,当我试图将文件打印到替换字符串中时,gsed(gnu sed)抛出了一个错误。各种逃跑的方法似乎都不管用,这相当令人沮丧。有人能看出这里出了什么问题吗 将证书文件读入变量 CERT=`cat../$1/tmp/$1-CERT.csr |同时读取i;不要重复$i;完成` 在云配置文件中替换: gsed-i“/write\u files:/a \-path:/home/core/$1-cert.csr\n权限:0

这有点奇怪。在将云配置文件推送到服务器之前,我使用gsed编辑云配置文件。由于某种原因,当我试图将文件打印到替换字符串中时,gsed(gnu sed)抛出了一个错误。各种逃跑的方法似乎都不管用,这相当令人沮丧。有人能看出这里出了什么问题吗

  • 将证书文件读入变量

    CERT=`cat../$1/tmp/$1-CERT.csr |同时读取i;不要重复$i;完成`

  • 在云配置文件中替换:

    gsed-i“/write\u files:/a \-path:/home/core/$1-cert.csr\n权限:0755\n所有者:core:core\n内容:\\n`printf'%s\n'\“$cert\'`./$1/tmp/cloud-config.yaml

  • 错误:

    gsed: -e expression #1, char 168: unknown command: `M'
    
    M恰好是证书文件第二行的第一个字符:

    -----BEGIN CERTIFICATE REQUEST-----
    MIICvjCCAaYCAQAweTELMAkGA1UEBhMCVUsxFzAVBgNVBAgMDkdyZWF0ZXIgTG9u
    
    我最终使用了awk:

    awk '/write_files:/{print $0 RS "- path: /home/core/certs/'"$1"'-cert.csr" RS "  permissions: 0755" RS "  owner: core:core" RS "  content: |"; while(getline line<"../'"$1"'/tmp/'"$1"'-cert.csr"){print "    "line};next}1' ../$1/tmp/cloud-config.yaml > swap.txt && mv swap.txt ../$1/tmp/cloud-config.yaml
    

    awk'/write_files://{print$0 RS“-path:/home/core/certs/'$1'-cert.csr“RS”权限:0755“RS”所有者:core:core“RS”内容:|”;while(getline line1)
    cert=$(“丑陋”是一种观点。我倾向于同意,但我发现大多数bash脚本本质上都很丑陋。问题中已经定义了输入和所需的输出。如果有更简单的方法来实现相同的结果,我会很感兴趣,但我最好奇的是上面的代码有什么问题。也许我只是瞎了眼,但我不知道t参见“问题中定义的”输入和输出示例。显示您的
    cloud\u config.yaml
    在预期修改之前和之后,以及相应的
    $1-cert.csr
    。我认为您在这里关注的是错误的事情,这很可能是我没有简化问题的错。yaml与此无关,因此$1的值也与此无关。为简单起见,您可以这么说周围的YAML是“Some text”(它实际上是在gsed命令中定义的),$1是“var”。真正的问题是在插入换行符的同时正确地转义嵌入的printf。如果您对此无能为力,那么我感谢您的兴趣,但也许可以转到其他方面。