2017-10-12 89 views
1

我最近问了一个类似的问题How To Insert File Contents After Line Match While Escaping Backslash只有意识到我需要做相反的事情。插入文件内容一行前匹配,同时转义反斜杠

使用从问题的代码,我曾尝试:

sed '/<\\tag>/i file2' file1 

第2次尝试:

awk '/<\\tag>/{print;system("cat File2.txt");before} 1' File1.txt 

但是,我无法得到它的比赛之前插入一行。

例子:

FILE1.TXT

Hello <[World!]> 1 
Hello <[World!]> 2 

FILE2.TXT:

<thanks> 
<tag> 
<example> 
<new> 
<\new> 
<\example> 
<\tag> 
<\thanks> 

所需的输出:

<thanks> 
<tag> 
<example> 
<new> 
<\new> 
<\example> 
Hello <[World!]> 1 
Hello <[World!]> 2 
<\tag> 
<\thanks> 

如果你能请帮我插入的文件内容后的内容在逃避反斜杠的情况下,我会很感激。

+0

它可能在'sed'中,但它是丑陋的,如果匹配在最后一行,则不起作用。 'sed'/ <\\tag>/{r file1.txt; H; d; }; H;小号/.*//; X; s/^ \ n //'file2.txt' – Kevin

+0

嘿凯文,谢谢你的尝试。我得到这个'sed:-e表达式#1,字符0:不匹配'{''检查时 – DomainsFeatured

回答

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

嗨,Ed,太棒了。当然,它的工作原理是:-)你是男人。此外,只是发布另一个问题,因为你有兴趣。自从你和我上次交谈之后,我已经学会了更多'awk' :-) – DomainsFeatured

+1

@ Ed-morton:这很聪明。好一个。 ! – batMan

+1

@DomainsFeatured:去它并将其标记为答案。这将有助于其他人寻找类似的解决方案。 – batMan

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}商店在阵列f1所述的File1.txt内容
/<\\tag>/{ for(i in f1) print f1[i]}:当遍历File2.txt如果找到匹配,则打印该数组的内容。

+0

第一个给我一个错误。第二个工作,但行不符合规定。不要让自己疯狂。我要解决它。你今天已经帮了我很多了。 – DomainsFeatured

+0

@DomainsFeatured:你在第一种情况下得到什么错误? – batMan

+0

'file1.txt:line 1:[World!]:No such file or directory' and 'file1.txt:line 2:[World!]:No such file or directory' – DomainsFeatured