在多行注释块外显示行

时间:2019-08-13 09:51:52

标签: perl text-processing

我正在尝试从Unix文件中过滤掉多行注释。我们将使用该文件对Oracle引擎运行

我尝试在下面使用,但未显示我想要的正确输出。

我的文件file.sql包含以下内容:

/* This is commented section
asdasd...
asdasdasd...
adasdasd..
sdasd */
I want this line to print
/* Dont want this to print */
/* Dont want this
  to print
  */
Want this to 
  print
    /*
Do not want 
this to print
*/

我的输出必须如下所示:

I want this line to print
Want this to 
  print

我尝试使用下面的perl首先向我展示多行注释中的行,但是它没有显示正确的输出:(

perl -ne 'print if //*/../*//' file.sql

我的主要目标是不显示多行注释行,而仅显示输出(如前所述)。

2 个答案:

答案 0 :(得分:2)

尝试一下:

perl -0777 -pe's{/\*.*?\*/}{}sg' file.sql

输出

I want this line to print


Want this to 
  print

说明

  • -0777:s浆模式
  • 修饰符标记s:使点与新行匹配
  • 修饰符标志g:在全局范围内反复匹配模式

答案 1 :(得分:1)

您非常亲密。这似乎可以满足您的要求。

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
  print unless m[/\*] .. m[\*/];
}

__DATA__
/* This is commented section
asdasd...
asdasdasd...
adasdasd..
sdasd */
I want this line to print
/* Dont want this to print */
/* Dont want this
  to print
  */
Want this to 
  print
    /*
Do not want 
this to print
*/

输出:

I want this line to print
Want this to 
  print

问题出在触发器(//*/../*//)两端的两个匹配运算符上。

首先,如果在匹配运算符上使用斜杠作为分隔符,则需要对正则表达式中的任何斜杠进行转义。通过从斜杠(/ ... /)改为使用m[ ... ]来解决这个问题。

其次,*在正则表达式中具有特殊含义(表示“先前事物的零个或多个”),因此您需要对其进行转义。

所以我们以m[/\*] .. m[\*/]结尾。

哦,您需要颠倒逻辑。您在使用if时应该使用unless

转换为您所使用的命令行脚本:

perl -ne 'print unless m[/\*] .. m[\*/]' file.sql