1

假设我有这个代码:

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

关于如何使它与或任何其他类似工具一起使用的任何sed想法perl

4

2 回答 2

5

使用sed

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


some code 2


some code 2
于 2013-09-09T06:17:34.520 回答
2

使用触发器运算符的 perl 解决方案:

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

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

于 2013-09-09T06:28:25.077 回答