4

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

class Test
  def procedure
    nil
  end
end

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

class Test
  def procedure
    nil
  finish
finish

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

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

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

4

3 回答 3

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

结果

class Test
  def procedure
    nil
  finish
finish
  • 我们只想查看可能同时包含的一对行end,因此仅在第一行以 结尾时才在第二行中读取end
  • 替换endfinish
于 2013-04-20T17:31:41.007 回答
1
perl -i -0777 -pe 's/\bend\s*\n\s*end$/finish\nfinish/ms' testfile.rb

此代码段在多行模式下工作。sed默认情况下是基于一行的。

于 2013-04-20T17:26:18.470 回答
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:]].

于 2013-04-20T17:34:59.287 回答