Shell:打开文件,在特定位置添加一行,然后替换特定行。可能吗?

时间:2013-07-17 09:34:01

标签: shell

嘿伙计我不知道这是否可以用shell完成?有一个200行的脚本,我只想改变:

 ...
 161. subject = subject.force_encoding('binary')
 162. body = msg.force_encoding('binary')
 163. 
 164. smtp.send_mail(<<EOS, @from, @to.split(/,/))
 165. Date: #{Time::now.strftime("%a, %d %b %Y %X")}
 ...

有关:

 161. subject = subject.force_encoding('binary')
 162. body = msg.force_encoding('binary')
 163. converted_time = Time.now.utc
 164. smtp.send_mail(<<EOS, @from, @to.split(/,/))
 165. Date: #{converted_time.strftime("%a, %d %b %Y %X")}
 ....

可以使用shell吗?我知道如何在最后添加内容或使用&gt;更新新内容的文件和&gt;&gt;但我不知道是否有可能以这种方式修改文件。如果没有,我只会使用我认为的perl脚本。

(代码开头的数字不是代码,仅供参考,是行号)

1 个答案:

答案 0 :(得分:2)

您可以使用此语法将第165行的全部内容替换为<new content>

sed "165s/.*/<new content>/g" file

在您的情况下,如果我看到它正确,您想要将内容添加到第163行并替换第165行中的内容。所以这将成为诀窍:

$ line163='converted_time = Time.now.utc'
$ line165='Date: #{converted_time.strftime("%a, %d %b %Y %X")}'
$
$ sed -e "3s/.*/$line163/g" -e "5s/.*/$line165/g" file
subject = subject.force_encoding('binary')
body = msg.force_encoding('binary')
converted_time = Time.now.utc
smtp.send_mail(<<EOS, @from, @to.split(/,/))
Date: #{converted_time.strftime("%a, %d %b %Y %X")}

注意我在我的案例中使用了第3行和第5行。我存储要在变量中使用的文本,然后使用sed "s/content/$variable/g"表达式。 -e用于同时执行多个不同的sed操作。

要使更改成为永久更改,请添加-i标记:

sed -i -e ... file

将使用新内容更新file。在此之前创建备份是很好的,可以通过以下方式轻松完成:

sed -i.bak -e ... file

它将使用新内容更新file,并且将使用名称file.bak(或您为i提供的任何扩展名)创建备份文件。