【问题标题】:Remove code between special comments from file从文件中删除特殊注释之间的代码
【发布时间】:2013-09-12 14:18:05
【问题描述】:

假设我有这个代码:

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 或任何其他类似的工具一起使用吗?

【问题讨论】:

  • 哦,倾斜牙签综合症的人性。

标签: regex perl bash replace sed


【解决方案1】:

使用sed

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


some code 2


some code 2

【讨论】:

  • 呸!感谢您使用简单的解决方案。
  • 哇,它正在工作!我不知道 d 标志的存在,这正是我所需要的。非常感谢。
【解决方案2】:

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

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

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

【讨论】:

  • 同样有效,但有点复杂。感谢您的工作示例并指出我的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2011-05-23
  • 2015-01-09
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多