用带有一些新行的var替换文本

时间:2019-03-19 17:18:17

标签: linux shell

我有一个变量 $ MY_VAR ,其中包含一些新行:

      hostAliases:
      - ip: "?.?.?.?"
        hostnames:
        - "m-0.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-1.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-2.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-3.mongodb-service.default.svc.cluster.local"

还有一个文件 my_file.txt ,其值必须替换:

some indented content ...
@@MY_VALUE@@
some indented content ...

我尝试使用以下方式替换它:

sed -i 's,@@MY_VALUE@@,'"$MY_VAR"',g' my_file.txt

这会导致以下错误:

sed: -e expression #1, char 36: unterminated `s' command

3 个答案:

答案 0 :(得分:1)

无需这样做:

MY_VAR=$(cat content.txt)

首先将文件内容读入变量,然后用该变量的内容替换第二个文件中的文本。

您可以使用此sed单步执行此操作:

sed '/@@MY_VALUE@@/{s///;
r content.txt
}' my_file.txt

某些缩进内容...

some indented content ...

      hostAliases:
      - ip: "?.?.?.?"
        hostnames:
        - "m-0.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-1.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-2.mongodb-service.default.svc.cluster.local"
      - ip: "?.?.?.?"
        hostnames:
        - "m-3.mongodb-service.default.svc.cluster.local"
some indented content ...

更新

您可以使用此awk用多行变量替换模式:

awk -v var="$var" '/@@MY_VALUE@@/{$0 = var} 1' my_file.txt

要内联保存更改,请使用gnu awl

awk -i inplace -v var="$var" '/@@MY_VALUE@@/{$0 = var} 1' my_file.txt

如果不使用gnu awk,请使用:

awk -v var="$var" '/@@MY_VALUE@@/{$0 = var} 1' my_file.txt >> $$.tmp &&
mv $$.tmp my_file.txt

答案 1 :(得分:0)

这是重现问题的简便方法:

sed -e 's/foo/hello
world/'

它显示foo而不是用两行替换sed: -e expression #1, char 11: unterminated `s' command

这是因为换行符结束了命令。您必须使用反斜杠将其转义:

sed -e 's/foo/hello\
world/'

您可以使用Bash的参数扩展(${var//search/replace})在变量中执行此操作:

sed "s/@@MY_VALUE@@/${var//$'\n'/$'\\\n'}/"

答案 2 :(得分:0)

我终于找到了一个完全不同的解决方案,方法是删除替换和拆分文件的值,并将其分为两部分:my_file_part1.txt和my_file_part2.txt,它们分别是变量之前的部分和变量之后的部分。

submit()