2012-06-28 36 views
7

我想给定模式使用的sed插入文件内容

这里是我的代码之前插入文件内容:

sed -i "" "/pattern/ { 
i\\ 
r $scriptPath/adapters/default/permissions.xml" 
}" "$manifestFile" 

它添加了路径,而不是文件的内容。

任何想法?

回答

20

为了在之前插入文字一个模式,您需要在读入文件之前将模式空间交换到保留空间。例如:

sed "/pattern/ { 
     h 
     r $scriptPath/adapters/default/permissions.xml 
     g 
     N 
    }" "$manifestFile" 
+0

该脚本必须加双引号,否则$ scriptPath不会被扩展。你能否解释为什么最后需要N? – hipe

+0

@hipe r命令只将队列读入插入到输出流中。直到周期结束或读取下一行时,它才会真正读取任何内容。如果没有N,文件将不会被插入,直到模式空间被打印出来为止,使其作为追加而不是插入。它非常*非直观。 –

+0

对我很好,谢谢你 – ridan

4

只需删除i\\

例子:

$ cat 1.txt 
abc 
pattern 
def 

$ echo hello > 2.txt 

$ sed -i '/pattern/r 2.txt' 1.txt 

$ cat 1.txt 
abc 
pattern 
hello 
def 
+3

它插入后的模式。如何在它之前插入内容? – ridan

1

我用awk得到了这样的事情。相貌丑陋,但确实在我的测试的伎俩:

命令:

cat test.txt | awk ' 
/pattern/ { 
    line = $0; 
    while ((getline < "insert.txt") > 0) {print}; 
    print line; 
    next 
} 
{print}' 

的test.txt:

$ cat test.txt 
some stuff 
pattern 
some other stuff 

insert.txt:

$ cat insert.txt 
this is inserted file 
this is inserted file 

输出:

some stuff 
this is inserted file 
this is inserted file 
pattern 
some other stuff 
0

CodeGnome的解决方案不起作用,如果图案是在最后一行.. 所以我用3个命令。

sed -i '/pattern/ i\ 
     INSERTION_MARKER 
     ' $manifestFile 
sed -i '/INSERTION_MARKER/r $scriptPath/adapters/default/permissions.xml' $manifestFile 
sed -i 's/INSERTION_MARKER//' $manifestFile