Perl / Sed:删除一个扩展到多行的函数

时间:2014-12-16 04:34:59

标签: perl sed

我想删除对函数XYZ的每次调用。问题是这个函数可能会扩展到多行。 E.g。

XYZ( "line 1",
     "line 2",
     "line 3" );

为简化起见,我假设);仅出现在通话结束时。

我已经尝试sed 's/XYZ(.*);//'但没有成功,但在sed中,.字符匹配任何字符,包括换行符。我可能会错过sed中的新行。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以将地址范围用作

sed '/^XYZ/, /);$/ d' inputFile
  • /^XYZ/起始地址

  • /);$/结束地址

  • d删除命令。从提供的地址范围中的模式空间中删除行

<强>测试

$ cat input
XYZ( "line 1",
     "line 2",
     "line 3" );

hello world

XYZ( "line 1",
     "line 2",
     "line 3" );

$ sed '/^XYZ/, /);$/ d' input

hello world

修改

处理函数在同一行中出现的情况

$ sed '/^XYZ.*);$/d;  /^XYZ/, /);$/ d' input

<强>测试

$ cat input
XYZ( "line 1",
     "line 2",
     "line 3" );
helo
XYZ( "line 1",     "line 2",     "line 3" );
hello world

$ sed '/^XYZ.*);$/d;  /^XYZ/, /);$/ d' input
helo
hello world

答案 1 :(得分:1)

perl -p0e 's!\bXYZ\(.*?\);!!gs' input

测试:

XYZ( "line 1",
     "line 2",
     "line 3" );

hello world

XYZ( "line 1",
     "line 2",
     "line 3" );
   XYZ(aaaa); XYZ(aaaa);  aaa(aaaa);

abcXYZ( aaaa );
   XYZ(aaaa);
   XYZabc(aa);

输出是:

hello world


     aaa(aaaa);

abcXYZ( aaaa );

   XYZabc(aa);