我對sed和正則表達式有點新。將兩個單詞之間的字符串替換爲另一個文本文件的內容
我試圖編輯一個文本文件,在這裏我想與另一個文本文件的全部內容,以取代第一文件中的兩個關鍵字之間的內容
應該喜歡這樣 -
keyword1 inbetweenstuff keyword2
這個
keyword1 textfromfile2 keyword2
我嘗試這個命令,但沒有運氣
01這裏我對sed和正則表達式有點新。將兩個單詞之間的字符串替換爲另一個文本文件的內容
我試圖編輯一個文本文件,在這裏我想與另一個文本文件的全部內容,以取代第一文件中的兩個關鍵字之間的內容
應該喜歡這樣 -
keyword1 inbetweenstuff keyword2
這個
keyword1 textfromfile2 keyword2
我嘗試這個命令,但沒有運氣
01這裏歐凱是準備使用的解決方案:
$ sed -i "s/\(keyword1\).*\(keyword2\)/\1 `cat file2` \2/g" file1
從file2
讀取和兩個關鍵詞之間的替代文本內file1
(僅適用如果file2
內容並不多)。
您正在嘗試使用錯誤的工具。 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中關鍵字之間有多少行。
嗯,它會保持file2的格式?它是一個多行文件,在常規間隔換行字符... – Sid5427
是的,它將對file2執行的所有操作都是故意刪除最終換行符(如果存在),以便它恰好適合file1關鍵字。 –
這可能爲你工作(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
file2是多行不幸的。 – Sid5427
比你想要更高級的東西,例如@ EdMorton的回答。 –