Bas*_*974 1 awk sed substitution
我有文件 A:一个 nginx 配置。在这个文件的某个地方我有{here}
我想用{here}另一个文件 B 的内容替换它:
location /blah {
proxy_pass "https://blah.com";
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过sed和awk (gsub),但是我遇到了返回/未转义字符的问题。
我找到了一个解决方案,但仅适用于模式,不适用于替换。在这个例子中,它将在我的标记之后附加 fileB 而不是替换它:
sed -i '/{here}/{r fileB
:a;n;ba}' nginx.conf
Run Code Online (Sandbox Code Playgroud)
这应该这样做:
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)