我有文件A:一个nginx配置。
在此文件的某处,我有{here}
我想用另一个文件B的内容替换{here}
:
location /blah {
proxy_pass "https://blah.com";
}
我尝试使用 sed 和 awk (gsub),但我遇到了返回/未转义字符的问题。
我找到了一个解决方案,但只适用于模式,不适用于替换。在此示例中,它将在我的标记之后附加fileB而不是替换它:
sed -i '/{here}/{r fileB
:a;n;ba}' nginx.conf
答案 0 :(得分:4)
您只需要:
awk 'NR==FNR{rep=(NR>1?rep RS:"") $0; next} {gsub(/{here}/,rep)}1' fileB nginx.conf
假设fileB不包含&
,因为它们被替换操作解释为RE匹配字符串。如果是,则在循环中使用index()和substr()。
如果{here}
是唯一的问题,请告诉我们,因为它会使问题变得更简单。
答案 1 :(得分:3)
这应该这样做:
awk 'NR==FNR { a[n++]=$0; next }
/{here}/ { for (i=0;i<n;++i) print a[i]; next }
1' fileB fileA
构建一个包含包含替换文件的所有行的数组。当模式在第二个文件中匹配时,打印出所有行。否则,末尾的1
表示打印原始行。
正如Ed正确指出的那样,循环初始化器是错误的。我已将其更改为i=0
,因此会打印第一行。此外,这将替换包含{here}
的行的全部内容,这可能是您需要的,也可能不是。
要覆盖原始文件,您可以执行以下操作:
awk '...' fileB fileA > tmp && mv tmp fileA
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 's/\(.*\){here}\(.*\)/echo '\''\1'\''$(cat fileB)'\''\2'\''/e' fileA