用文件内容替换字符串

时间:2014-08-28 20:04:03

标签: awk sed substitution

我有文件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

3 个答案:

答案 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