在转义前插入文件内容一行,同时转义反斜杠

时间:2017-10-12 21:50:39

标签: linux bash unix awk sed

我最近问了一个类似的问题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>

如果你能帮助我在线路匹配后插入文件内容,同时逃避反斜杠,我真的很感激。

2 个答案:

答案 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,然后打印数组内容。