用文件内容替换字符串

Bas*_*974 1 awk sed substitution

我有文件 A:一个 nginx 配置。在这个文件的某个地方我有{here}

我想用{here}另一个文件 B 的内容替换它:

location /blah {
     proxy_pass "https://blah.com";
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过sedawk (gsub),但是我遇到了返回/未转义字符的问题。

我找到了一个解决方案,但仅适用于模式,不适用于替换。在这个例子中,它将在我的标记之后附加 fileB 而不是替换它:

sed -i '/{here}/{r fileB
:a;n;ba}' nginx.conf
Run Code Online (Sandbox Code Playgroud)

Tom*_*ech 6

这应该这样做:

awk 'NR==FNR { a[n++]=$0; next } 
/{here}/ { for (i=0;i<n;++i) print a[i]; next }
1' fileB fileA
Run Code Online (Sandbox Code Playgroud)

构建一个包含替换文件的所有行的数组。当模式在第二个文件中匹配时,打印出所有行。否则,1最后的意思是打印原始行。

正如 Ed 正确指出的那样,循环初始化程序是错误的。我已将其更改i=0为打印第一行。此外,这会替换包含 的行的全部内容{here},这可能是您需要的,也可能不是。

要覆盖原始文件,您可以执行以下操作:

awk '...' fileB fileA > tmp && mv tmp fileA
Run Code Online (Sandbox Code Playgroud)