Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用带有新行的变量替换文本中的_Linux_Shell - Fatal编程技术网

Linux 用带有新行的变量替换文本中的

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" -

我有一个var$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

这里有一种更容易重现问题的方法:

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