sed命令通过在块启动之前搜索一些字符串来注释掉整个花括号块

时间:2018-01-23 10:09:52

标签: bash shell awk sed

我有一些文件包含如下所示的块:

   public return_type var_name {get; set;}

   public return_type var2_name {
        get { if (some_condition) {some_code} else {some_code}} set; }

   public return_type var3_name {
        get { 
              if (some_condition) 
              {
                some_code
              } 
              else {
                     some_code
                   }
                }
   }

所以sed命令应该注释整个块var2_name或var3_name。它应该搜索变量并注释该变量的块。

必需输出:

   public return_type var_name {get; set;}

   // public return_type var2_name {
   //     get { if (some_condition) {some_code} else {some_code}} set; }

   //public return_type var3_name {
   //     get { 
   //           if (some_condition) 
   //           {
   //             some_code
   //           } 
   //           else {
   //                  some_code
   //                }
   //             }
   //}

2 个答案:

答案 0 :(得分:0)

Awk 解决方案(假设多行功能定义内部没有空行):

awk '/\<var[23]_name\>/{ f=1 }f && NF{ $0="//"$0 }!NF{ f=0 }1' file

输出:

public return_type var_name {get; set;}

//public return_type var2_name {
//     get { if (some_condition) {some_code} else {some_code}} set; }

//public return_type var3_name {
//     get { 
//           if (some_condition) 
//           {
//             some_code
//           } 
//           else {
//                  some_code
//                }
//             }
//}

答案 1 :(得分:0)

这个问题的问题是正则表达式不可能匹配相应的括号。所以你需要自己跟踪计数。

在以下解决方案中,我做出以下假设:

  • 有问题的块的右括号是该行的最后一个括号。

然后以下awk会做到这一点:

awk 'function count_braces(str) { return gsub(/{/,"",str) - gsub(/}/,"",str) }
     BEGIN{count=-1}
     /var2_name|var3_name/{ count=count_braces($0);
                            print "//",$0; next }
     (count > 0) { print "//",$0;
                   count=count+count_braces($0);
                   next }
     {print $0}' <file>

并给出输出:

  public return_type var_name {get; set;}

//    public return_type var2_name {
//         get { if (some_condition) {some_code} else {some_code}} set; }

//    public return_type var3_name {
//         get { 
//               if (some_condition) 
//               {
//                 some_code
//               } 
//               else {
//                      some_code
//                    }
//                 }
//    }

请注意,在此解决方案中,var2_namevar3_name不应出现在任何其他上下文中。拥有像/^[[:blank:]]*public return type (var2_name|var3_name)/这样的改进正则表达式可能会更好。