2014-09-24 248 views
1

行我的問題是下面的一個變種:在文本文件替換行與其他文本文件

bash: replace an entire line in a text file

問題有一個與給定的字符串替換文件的第N行(替換線)。就我而言,我不能只輸入替換行,但我必須從另一個文件中讀取它。

例如:

textfile1:

my line 
your line 
his line 
her line 

textfile2:

our line 

我想從textfile2行更換textfile1 2號線。

我想我可能只是讀textfile2

while IFS= read SingleLine 

等,然後使用$SingleLine作爲替代路線,但我失敗了......根據我用引號的類型(請原諒我的無知。 ..)我結束了與文本$ SINGLELINESINGLELINE或剛剛收到錯誤消息替換有問題的行: - [

我相信你能幫助我!

編輯有關解決方案: 我去與小改內嵌解決方案

sed '2d;1r textfile2' textfile1 > newfile1 

要更換的第N行,該解決方案將是(見的解釋接受的解決方案評論)

sed 'Nd;Mr textfile2' textfile1 > newfile1 

其中N爲期望的行數並且M = N-1。

謝謝大家!

回答

4

使用sed

sed '2d;1r file2' file1 
my line 
our line 
his line 
her line 

爲了使聯編輯:

sed -i.bak '2d;1r file2' file1 
+0

謝謝!但是......你能解釋'2d; 1r'部分嗎?特別是:如果我想更換第四條線? – ppapakon 2014-09-24 06:49:17

+0

'2d'正在刪除第2行,'1r file2'正在替換第1行結束後的file2內容。要替換第4行,請使用:'sed'4d; 3r file2'file1' – anubhava 2014-09-24 06:50:47

+1

好!謝謝,這真的很快! :-)我用小小的改變'sed'2d; 1r textfile2'textfile1> newfile1'去換取內聯解決方案來保存一個新文件而不破壞原來的文件。 – ppapakon 2014-09-24 06:59:41

1

我會與sed解決方案anubhava貼去。這是bash的替代方案。

#!/bin/bash 

while read -r line; do 
    ((++linenum == 2)) && while read -r line; do 
     echo "$line" 
     continue 2 # optional param to come out of nested loop 
    done < textfile2 
    echo "$line"; 
done < textfile1 

或使用awk

awk 'FNR==2{if((getline line < "textfile2") > 0) print line; next}1' textfile1 
0

這是腳本,或者直接從終端? 如果這是一個腳本。您可以嘗試將文件2存儲到變量中 fromfile2=$(cat textfile2) 然後將您的textfile1替換爲 sed -i "s/your line/$fromfile2"。 希望它有幫助。

+0

謝謝!我忘了指定我無法輸入原始文件的第二行。然後我寫什麼而不是上面的「你的路線」?我試過sed「2s/*/$ fromfile2 textfile1> textfile1new但它不起作用(」在正則表達式中未終止的替代品「)。 – ppapakon 2014-09-24 06:50:18

相關問題