我有两个文件,内容如下
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,但它不是约束。
如果想对pattern1
或pattern3
答案 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
[ ~]$