我有一个变量 $ 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
答案 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()