我最近问了一个类似的问题How To Insert File Contents After Line Match While Escaping Backslash,但却意识到我需要做相反的事情。
使用该问题的代码,我尝试过:
FcName
第二次尝试:
sed '/<\\tag>/i file2' file1
但是,我无法让它在比赛前插入一行。
示例:
FILE1.TXT
awk '/<\\tag>/{print;system("cat File2.txt");before} 1' File1.txt
FILE2.TXT:
Hello <[World!]> 1
Hello <[World!]> 2
期望的输出:
<thanks>
<tag>
<example>
<new>
<\new>
<\example>
<\tag>
<\thanks>
如果你能帮助我在线路匹配后插入文件内容,同时逃避反斜杠,我真的很感激。
答案 0 :(得分:2)
$ awk 'FNR==NR{n=n $0 ORS; next} /<\\tag>/{$0=n $0} 1' file1 file2
<thanks>
<tag>
<example>
<new>
<\new>
<\example>
Hello <[World!]> 1
Hello <[World!]> 2
<\tag>
<\thanks>
答案 1 :(得分:1)
在awk
解决方案中,您需要执行以下更改:
1.交换文件名,因为您可以使用File2.txt并打印找到匹配项的File1.txt内容。
2.删除awk中的print;
,因为您不想在输出中打印<\tag>
两次。
3. awk中没有关键字before
。请删除它。
awk '/<\\tag>/{system("cat File1.txt");} 1' File2.txt
其他可能的解决方案是:
$ awk 'FNR==NR{f1[++i]=$0; l=i; next} /<\\tag>/{ for(i=1; i<=l; i++) print f1[i]}1' File1.txt File2.txt
<thanks>
<tag>
<example>
<new>
<\new>
<\example>
Hello <[World!]> 1
Hello <[World!]> 2
<\tag>
<\thanks>
FNR==NR{f1[$0]=$0; next}
在File1.txt
数组中存储f1
的内容
/<\\tag>/{ for(i in f1) print f1[i]}
:如果找到匹配项,则迭代File2.txt
,然后打印数组内容。