我正在尝试从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
我的主要目标是不显示多行注释行,而仅显示输出(如前所述)。
答案 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