0

嘿伙计们,我不知道这是否可以用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可以吗?我知道如何在最后添加内容或使用 > 和 >> 用新内容更改文件,但我不知道是否可以以这种方式修改文件。如果没有,我将只使用我认为的 perl 脚本。

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

4

1 回答 1

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)创建备份文件。

于 2013-07-17T09:39:06.887 回答