假设我有这段代码:
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
或此类任何其他工具一起使用的任何想法?
答案 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
会发出警告)。