如何将一个文件中的一组字符串替换为另一个文件中的另一个组

时间:2017-01-04 09:46:06

标签: linux file awk replace sed

我有两个文件,内容如下

file1

   pattern1something1end1
   pattern1something2end2
   pattern2something3end3
   pattern2something4end4
   pattern3something5end5
   pattern4something6end6

file2

   pattern0something7end7
   pattern1something8end8
   pattern1something9end9
   pattern2something10end10
   pattern2something11end11
   pattern2something12end12
   pattern3something13end13
   pattern4something14end14

现在我希望更改file1,所有从pattern2开始的行都会被file2中所有以pattern2 linux开头的行替换环境

所以file1中的最终内容将如下所示

   pattern1something1end1
   pattern1something2end2
   pattern2something10end10
   pattern2something11end11
   pattern2something12end12
   pattern3something5end5
   pattern4something6end6

两个文件中的任何模式的行数可以不同,替换应使用一组行完成。

两个文件中只有一组以任何模式开头的行。

我想最好使用sed,但它不是约束。

如果想对pattern1pattern3

进行类似的练习,同样的解决方案也适用

2 个答案:

答案 0 :(得分:0)

awk 'NR==FNR{if(/^pattern2/)a[++i]=$0;next}/^pattern2/{$0=a[++j]}7' f2 f1 

上面的awk单行将用file2中的匹配行替换file1中的所有^pattern2行。

您可以使用awk -v pat="whatever" ...然后在代码中检查pat变量,以便使其适用于pattern1, 2, 3,4...

假设file2中匹配的行数>> = file1中的数字

根据需求变更更新:

awk 'NR==FNR{if(/^pattern2/)a[++i]=$0;next}
     /^pattern2/{p=1;next}p{for(x in a)print a[x]}7' f2 f1  

试验:

kent$  head f1 f2    
==> f1 <==
pattern1something1end1
pattern1something2end2
pattern2something3end3
pattern2something4end4
pattern3something5end5

==> f2 <==
pattern0something7end7
pattern1something8end8
pattern1something9end9
pattern2something10end10
pattern2something11end11
pattern2something12end12
pattern3something13end13
pattern4something14end14

kent$  awk 'NR==FNR{if(/^pattern2/)a[++i]=$0;next}/^pattern2/{p=1;next}p{for(x in a)print a[x]}7' f2 f1 
pattern1something1end1
pattern1something2end2
pattern2something10end10
pattern2something11end11
pattern2something12end12
pattern3something5end5

答案 1 :(得分:0)

 awk 'BEGIN{f=1}
      NR==FNR{if(/^pattern2/){
               if(a==""){a=$0;}else{a=a"\n"$0;}
             }next;}
     /pattern2/&&(f==1)
     {$0=a;f=0;}1' file2 file1

以下测试结果:

[ ~]$ awk 'BEGIN{f=1}NR==FNR{if(/^pattern2/){if(a==""){a=$0;}else{a=a"\n"$0;}}next}/pattern2/&&(f==1){$0=a;f=0}1' file2 file1
pattern1something1end1
pattern1something2end2
pattern2something10end10
pattern2something11end11
pattern2something12end12
pattern2something4end4
pattern3something5end5
[ ~]$