从文件中删除特殊注释之间的代码

时间:2013-09-09 06:10:06

标签: regex perl bash replace sed

假设我有这段代码:

some code 1

// @if (debug)
code to remove
// @endif

some code 2

// @if (debug)
code to remove
// @endif

some code 2

我想删除// @if (debug)// @endif之间的所有代码。为此,我发现sed命令只有一个// @if (debug)实例才有效,但如果有多个实例则不然,因为sed不支持非贪婪的匹配(在上面的示例中,也删除了some code 2)。这是命令:

sed -r -n '1h;1!H;${;g;s/\/\/\s*@if\s*\(\s*debug\s*\)([^\0]*?)\/\/\s*@endif//g;p;}' file_path.js > file_path.min.js

我读过我可以使用支持非贪婪匹配的perl,但我无法使其发挥作用。这是尝试:

perl -pe 's/\/\/\s*@if\s*\(\s*debug\s*\)([^\0]*?)\/\/\s*@endif//g' file_path.js > file_path.min.js
perl -0pe 's/\/\/\s*@if\s*\(\s*debug\s*\)([^\0]*?)\/\/\s*@endif//g' file_path.js > file_path.min.js
perl -0777 -pe 's/\/\/\s*@if\s*\(\s*debug\s*\)([^\0]*?)\/\/\s*@endif//g' file_path.js > file_path.min.js

有关如何使其与sedperl或此类任何其他工具一起使用的任何想法?

2 个答案:

答案 0 :(得分:5)

使用sed

$ sed '/^\/\/ @if (debug)/,/^\/\/ @endif/d' inputfile
some code 1


some code 2


some code 2

答案 1 :(得分:2)

使用触发器操作符的perl解决方案:

perl -nle 'm{//\s*\@if\s*\(\s*debug\s*\)}..m{//\s*\@endif} or print' file_path.js

请记住要转义@,否则@if@endif会被解释为数组变量(-w会发出警告)。