Linux 用带有新行的变量替换文本中的
我有一个var$MY_var,其中包含一些新行:Linux 用带有新行的变量替换文本中的,linux,shell,Linux,Shell,我有一个var$MY_var,其中包含一些新行: hostAliases: - ip: "?.?.?.?" hostnames: - "m-0.mongodb-service.default.svc.cluster.local" - ip: "?.?.?.?" hostnames: - "m-1.mongodb-service.default.svc.cluster.local" -
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
这里有一种更容易重现问题的方法:
sed -e 's/foo/hello
world/'
它没有用两行替换foo
,而是显示sed:-e expression#1,char 11:unterminated`s'命令
这是因为换行结束命令。你必须用反斜杠来摆脱它们:
sed -e 's/foo/hello\
world/'
您可以通过Bash的参数扩展(${var//search/replace}
)在变量中执行此操作:
没有必要这样做:
MY_VAR=$(cat content.txt)
首先将文件内容读入变量,然后用该变量的内容替换第二个文件中的文本
您可以使用此sed
单步执行此操作:
sed '/@@MY_VALUE@@/{s///;
r content.txt
}' my_file.txt
一些缩进的内容。。。
更新: 您可以使用此
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
我最终找到了一个完全不同的解决方案,删除了要替换的值,并将我的文件分为两部分:my_file_part1.txt和my_file_part2.txt,这两部分分别是变量前面的部分和变量后面的部分
touch my_file.txt
cat my_file_part1.txt >> my_file.txt
echo "$MY_VAR" >> my_file.txt
cat my_file_part2.txt >> my_file.txt
哼,这似乎与我的问题无关。我尝试将值@@my_value@@替换为文件my_file.txt中的值$my_VAR。(-我的意思是就地)我将内容保存到文件中,并使用my_VAR=$(cat content.txt)填充变量。是否正确转义了特殊字符?是否尝试使用双引号
sed-I“s,@@MY_VALUE@,$MY_VAR,g”MY_file.txt
谢谢,但是文件的内容存储在GitLab CI变量上。不可能执行您编写的操作。我不明白您所说的GitLab CI变量
是什么意思。但是您编写了这样的操作MY_VAR=$(cat content.txt)
答案基于此。另请查看awk
变体不要将此作为答案发布。我的\u文件\u part1.txt
来自何处?拆分的位置和的位置。@@my\u值@
。
awk -v var="$var" '/@@MY_VALUE@@/{$0 = var} 1' my_file.txt >> $$.tmp &&
mv $$.tmp my_file.txt
touch my_file.txt
cat my_file_part1.txt >> my_file.txt
echo "$MY_VAR" >> my_file.txt
cat my_file_part2.txt >> my_file.txt