Awk 用文件内容替换字符串

Awk 用文件内容替换字符串,awk,sed,substitution,Awk,Sed,Substitution,我有一个文件: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

我有一个文件: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
这应该做到:

awk 'NR==FNR { a[n++]=$0; next } 
/{here}/ { for (i=0;i<n;++i) print a[i]; next }
1' fileB fileA
这应该做到:

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

这可能适用于GNU sed:

sed 's/\(.*\){here}\(.*\)/echo '\''\1'\''$(cat fileB)'\''\2'\''/e' fileA

这可能适用于GNU sed:

sed 's/\(.*\){here}\(.*\)/echo '\''\1'\''$(cat fileB)'\''\2'\''/e' fileA
您所需要的只是:

awk 'NR==FNR{rep=(NR>1?rep RS:"") $0; next} {gsub(/{here}/,rep)}1' fileB nginx.conf
假设fileB不包含&s,因为替换操作会将它们解释为重新匹配的字符串。如果确实如此,则在循环中使用index和substr

如果{here}是唯一的问题,请告诉我们,因为这会使问题变得更简单。

您只需要:

awk 'NR==FNR{rep=(NR>1?rep RS:"") $0; next} {gsub(/{here}/,rep)}1' fileB nginx.conf
假设fileB不包含&s,因为替换操作会将它们解释为重新匹配的字符串。如果确实如此,则在循环中使用index和substr


如果{here}是唯一的问题,请告诉我们,因为这会使问题变得更简单。

的可能重复。我刚刚回答了这个问题,它非常相似。awk技术应该特别有效。实际上,它有点不同,我已经发布了一个答案。可能是重复的。我刚刚回答了这个问题,它非常相似。awk技术应该特别有效。实际上,它有点不同,我已经发布了一个答案。感谢这个awk解决方案!我很有兴趣看到一个sed替代我发布的内容。没问题。也许比我有更好的sed技能的人能够提供一个sed解决方案。@Ed谢谢,我想在0开始循环。我知道split等函数通常使用基于1的数组索引,从0开始有什么问题吗?我假设{here}是独立的+1谢谢你的解决方案。@Ed谢谢你的见解。另外,有趣的是,后缀增量足以产生0的值,即awk'BEGIN{print n++}结果为0,而不是空字符串。True。很高兴它足够聪明,可以从上下文中看出变量是一个数字,而不必首先实际递增它。顺便说一句,我的意思是,您需要编写一个函数来从字符串填充数组,就像split所做的那样,使用原始字符串或数组的长度或与数组的主要用途/内容分离的一些其他元信息填充数组[0]非常有用。感谢这个awk解决方案!我很有兴趣看到一个sed替代我发布的内容。没问题。也许比我有更好的sed技能的人能够提供一个sed解决方案。@Ed谢谢,我想在0开始循环。我知道split等函数通常使用基于1的数组索引,从0开始有什么问题吗?我假设{here}是独立的+1谢谢你的解决方案。@Ed谢谢你的见解。另外,有趣的是,后缀增量足以产生0的值,即awk'BEGIN{print n++}结果为0,而不是空字符串。True。很高兴它足够聪明,可以从上下文中看出变量是一个数字,而不必首先实际递增它。顺便说一句,我指的是需要编写一个函数来从字符串填充数组,就像split所做的那样,用原始字符串或数组的长度或与数组的主要用途/内容分离的其他元信息填充数组[0]可能很有用。我已经试过了,它不会在fileB中保留返回字符。如果我理解正确的话,您正在捕获模式前后的内容,并在fileB周围进行回音。不过,我有点迷失在那些单一的un/转义引号中。我已经尝试过了,它没有在fileB中保留返回字符。如果我理解正确的话,您正在捕获模式前后的内容,并在fileB周围进行回音。不过,我有点迷失在那些单一的联合国/转义引用中。