2014-09-24 221 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

相关问题