将sed的输出插入到pattern之间的另一个文件中

时间:2018-05-23 19:02:03

标签: shell sed

我必须在一个模式中将一些内容从一个file1替换为file2 文件1

/* start */
    abc
/* end */

file2的

/* start */
    xyz
/* end */

结果应该在file2

/* start */
    abc
/* end */

我为实现这一目标所做的工作如下:

sed -n "/start/,/end/p" file1 >> sed -i 's/start.*end/start  end/g' file2

但是上面附加在file2中。请指导

3 个答案:

答案 0 :(得分:1)

如果你想改变字符串从开始到结束之间的行从Input_file1到Input_file2,那么下面的内容可以帮助你。

awk 'FNR==NR{if($0 ~ /^\/\* start \*\//){flag=1;next};if($0 ~ /\/\* end \*\//){flag=""};if(flag){val=val?val ORS $0:$0};next} /^\/\* start \*\//{flag2=1;print;next} /\/\* end \*\//{flag2=""} flag2{$0=val;flag2=""} 1'  Input_file1  Input_file2

现在也添加非单线形式的解决方案。

awk '
FNR==NR{
  if($0 ~ /^\/\* start \*\//){
     flag=1;
     next};
  if($0 ~ /\/\* end \*\//){
     flag=""};
  if(flag){
     val=val?val ORS $0:$0};
  next
}
/^\/\* start \*\//{
  flag2=1;
  print;
  next}
/\/\* end \*\//{
  flag2=""}
flag2{
  $0=val;
  flag2=""
}
1'  Input_file1  Input_file2

如果您想将输出保存到Input_file2本身,请将> temp_file && mv temp_file Input_file2附加到上面代码的最后一行。

答案 1 :(得分:1)

你想要从file2到/start/的行,接下来是file1之间的行,最后是文件2中的结果行。
忽略边界时,这将是

(
   sed -n "1,/start/p" file2
   sed -n "/start/,/end/p" file1
   sed -n "/end/,$ p" file2
) > /tmp/outputfile

边界问题是双开始/停止标记,当file2以/start/开头或以/end/结尾时会发生什么。
您可以使用

修复边界问题
(
   sed "/start/,$ d" file2
   sed -n "/start/,/end/p" file1
   sed "1,/end/ d" file2
) > /tmp/outputfile

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -n '/start/,/end/p' file1 |
sed -e '/start/,/end/{/end/r /dev/stdin' -e 'd}' file2

将第一个文件的startend之间的输出传递给stdout。删除第二个文件中startend之间的所有行,并在遇到end时将其替换为stdin的内容。