2012-06-28 38 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