sed - 替换匹配模式的几个连续行

时间:2013-04-20 17:20:56

标签: regex linux bash sed

我正在尝试用文本替换文件中的两个连续行。例如:
testfile.rb

class Test
  def procedure
    nil
  end
end

我正在努力实现这一目标:
testfile.rb

class Test
  def procedure
    nil
  finish
finish

所以我需要替换最后2行,但这不起作用:

sed -i 's/^\s\send\nend/  finish\nfinish/' testfile.rb

我知道它失败了,因为替换是逐行的。但是我怎么能这样做呢?

3 个答案:

答案 0 :(得分:3)

sed '/end$/N;//s/end/finish/g' testfile.rb

结果

class Test
  def procedure
    nil
  finish
finish
  • 我们只想在它们可能都包含end的情况下查看一对行,所以 当第一行以end
  • 结尾时,仅在第二行读取
  • end替换为finish

答案 1 :(得分:1)

perl -i -0777 -pe 's/\bend\s*\n\s*end$/finish\nfinish/ms' testfile.rb

此代码段适用于多行模式。 sed默认为一行。

答案 2 :(得分:0)

另一种方式:

sed 'N;s/^  end\nend$/  finish\nfinish/;t;P;D' testfile.rb

灵活的缩进:

sed 'N;s/^\( *\)end\n\( *\)end$/\1finish\n\2finish/;t;P;D' testfile.rb

要获得更灵活的缩进,请将空格更改为[[:space:]]