使用perl one liner regex substitution

时间:2016-09-21 19:17:56

标签: regex perl

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

只是一个大概(请适应你的情况......)

 try
 {
     ZipFile.CreateFromDirectory(pathToFilesToZip, zipPath, CompressionLevel.Fastest, true);
     //ZipFile.ExtractToDirectory(zipPath, pathToStoreNewZipFile);
     return true;
  }
  catch (Exception ex)
  {
      //log error here
      var errorMessage = ex.InnerException;
      Console.WriteLine(errorMessage);
      return false;
  }

其中:

  • ...perl -i -p0e 's{(log.*?((info)|(debug)).*?;)}{ $1 =~ s!^|\n!\n//!gr }gsei' 代替.*?表现非greddy
  • .*将全文作为单个记录处理
  • -p0e进行内部换行的额外处理

请在申请前进行测试......

答案 1 :(得分:1)

您可以使用range operatorstart .. stop

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