2015-08-08 25 views
1

我對sed和正則表達式有點新。將兩個單詞之間的字符串替換爲另一個文本文件的內容

我試圖編輯一個文本文件,在這裏我想與另一個文本文件的全部內容,以取代第一文件中的兩個關鍵字之間的內容

應該喜歡這樣 -

keyword1 inbetweenstuff keyword2 

這個

keyword1 textfromfile2 keyword2 

我嘗試這個命令,但沒有運氣

01這裏

回答

1

歐凱是準備使用的解決方案:

$ sed -i "s/\(keyword1\).*\(keyword2\)/\1 `cat file2` \2/g" file1 

file2讀取和兩個關鍵詞之間的替代文本內file1(僅適用如果file2內容並不多)。

+1

file2是多行不幸的。 – Sid5427

+1

比你想要更高級的東西,例如@ EdMorton的回答。 –

3

您正在嘗試使用錯誤的工具。 sed用於簡單替換個別行(s/old/new/),就是這樣。對於更有趣的事情你應該使用awk。

隨着GNU AWK多炭RS,gensub(),以及用於匹配的第三ARG():

$ cat file1 
keyword1 IN BETWEEN 
STUFF ON 
ONE OR MORE 
LINES keyword2 

$ cat file2 
NOW IS 
THE WINTER OF 
OUR DISCONTENT 

$ cat tst.awk 
BEGIN { RS="^$"; ORS="" } 
NR==FNR { new = gensub(/\n$/,"",""); next } 
match($0,/(.*keyword1).*(keyword2.*)/,a) { print a[1] new a[2] } 

$ awk -f tst.awk file2 file1 
keyword1 NOW IS 
THE WINTER OF 
OUR DISCONTENT keyword2 

注意上面對待file2內容作爲文字串,因此內容的「file2」可以是任何東西。如果「file2」包含&(例如\1/或...),請嘗試使用任何sed解決方案。它也不關心file2中有多少行,或者file1中關鍵字之間有多少行。

+0

嗯,它會保持file2的格式?它是一個多行文件,在常規間隔換行字符... – Sid5427

+0

是的,它將對file2執行的所有操作都是故意刪除最終換行符(如果存在),以便它恰好適合file1關鍵字。 –

1

這可能爲你工作(GNU SED):

sed -e '/keyword1\s*/{:a;/\s*keyword2/!{N;ba};s/\n//g;s/keyword1\s*/&\n/;s/\s*keyword2/\n&/;P;e cat inserted_file' -e 's/.*\n//}' file 

這看起來對keyword1,並保持該行或許後續行高達模式空間keyword2。然後刪除所有換行符並在keyword1之後和keyword2之前插入換行符。然後打印keyword1之前的部分行,然後打印inserted_file,最後從keyword2打印到行末。

這將用換行符圍繞inserted_file。如果這些不是必需的,那麼後處理該文件:

sed -r 'N;s/(keyword1\s*)\n/\1/;s/\n(\s*keyword2)/\1/;P;D' new_file 
相關問題