如何用SED替换YML文件中的文本,以确保保留凹痕



我有一个带有以下内容的yaml文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
    BODY

我需要用application.properties文件内容替换身体。我已经使用sed做到了:

sed -i -e '/BODY/r target/classes/application-dev.properties' -e 's///' -e '/^ *$/d'  target/classes/$kubeConfigFile

它可以做我需要的事情,但失去了凹痕,我得到的就是这样:

apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
server.port=8080
server.context-path=/
spring.main.banner-mode=off
logbook.format.style=http

我该怎么做才能保持凹痕?

还有 -e '/^ *$/d'在sed命令中部分删除空白行的另一件事,但似乎也行不通。

预期输出如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
    server.port=8080
    server.context-path=/
    spring.main.banner-mode=off
    logbook.format.style=http   

更新:我有一个Jenkins管道脚本,可以在以下三行中实现我想要的东西:

   sh ( script : "sed -i -e 's/^[ t$]*/   /' -e "/^ *$/d"  ./target/classes/"+configFile, returnStdout: true).trim() //remove trailing spaces and blank lines
   sh ( script : "sed -i -e "/BODY/r ./target/classes/"+configFile+"" -e "s///" ./target/classes/" + configMapKubernetes, returnStdout: true).trim() // insert content of application-dev.properties to YAML file using BODY
   sh ( script : "sed -i -e "/^ *$/d"  ./target/classes/" + configMapKubernetes, returnStdout: true).trim() //remove  blank lines

管道脚本在Groovy中,因此整个命令都在双引号内。

sed用于在单个字符串上进行简单的s/old/new ,即全部。这个尴尬脚本可能是您想要的:

$cat tst.awk
NR==FNR {
    rec[++numLines] = $0
    next
}
s = index($0,"BODY") {
    indent = sprintf("%*s",s-1,"")
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        print indent rec[lineNr]
    }
    next
}
{ print }

例如,给定以下输入文件:

$ cat foo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
    BODY
$ cat props
here is some text
    split across
  a few lines

我们可以这样做,它使用YAML文件中的身体凹痕,但也保留了Props File的任何其他缩进:

$ awk -f tst.awk props foo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
    here is some text
        split across
      a few lines

如果您想忽略props文件中的凹痕,并将所有道具的文本列在身体开始的位置,这是一个简单的调整:

$ cat tst.awk
NR==FNR {
    sub(/^[[:space:]]+/,"")
    rec[++numLines] = $0
    next
}
s = index($0,"BODY") {
    indent = sprintf("%*s",s-1,"")
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        print indent rec[lineNr]
    }
    next
}
{ print }
$ awk -f tst.awk props foo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: castlereport-cfg
  namespace: qa
data:
  application.properties: |
    here is some text
    split across
    a few lines

这可能对您有用(gnu sed(:

sed -E 's/^(s*)BODY/sed "/\S/!d;s#^#1#" propertyFile/e' file

此解决方案将包含BODY的行替换为另一个SED调用,该线将 BODY词在属性文件中附加到每个行之前的whitespace。空行也从属性文件中删除。如果还要从原始文件中删除空行,请使用:

sed -E '/S/!d;s/^(s*)BODY/sed "/\S/!d;s#^#1#" propertyFile/e' file

最新更新