【问题标题】:Comment out multiline log statements using perl one liner regex substitution使用 perl 单行正则表达式替换注释掉多行日志语句
【发布时间】:2016-09-22 20:12:32
【问题描述】:

我有一个 perl 单行,当日志语句在一行时可以工作:

find  -type f -iname "*java" | xargs -d'\n' -n 1 perl -i -pe 's{(log.*((info)|(debug)).*)}{//$1}gi'

但是尝试修改它以在多行上工作是很棘手的。我知道 s 修饰符将匹配换行符,但我如何让它注释掉后续行(即假设日志字符串没有它,最多 ;)?

我也可以将多行日志语句转换为单行日志语句的解决方案。我也会接受 C 风格的 cmets(尽管为 C++ 风格的 cmets 找到解决方案会很好)。

(不要告诉我关闭日志记录。任何真正尝试过的人都会意识到这在非平凡的应用程序中是多么的复杂。)

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    只是一个大概的想法(请适应您的情况...)

    ...perl -i -p0e 's{(log.*?((info)|(debug)).*?;)}{ $1 =~ s!^|\n!\n//!gr }gsei'
    

    地点:

    • .*? 而不是 .* 表现得不贪心
    • -p0e 将全文作为一条记录处理
    • $1 =~ s!^|\n!\n//!gr 对内部换行进行额外处理

    申请前请先测试一下...

    【讨论】:

    • 哦,2 和 3 对我来说是新成语,看起来非常有用。如果这不能满足我的需求,我会跟进。
    • 嗯,它注释掉了很多导入行。稍后我将不得不仔细查看以进行调试。
    • 如果您提供一些有问题的案例的示例,我可以尝试提供替代方案...
    【解决方案2】:

    您可以使用range operatorstart .. stop

    perl -i -pe 's!^!//! if /log.*(info|debug)/ .. /;/'
    

    【讨论】:

      猜你喜欢
      • 2013-08-22
      • 2017-11-16
      • 2014-12-08
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2015-02-25
      • 1970-01-01
      相关资源
      最近更新 更多