首页 > 解决方案 > 如何在 awk 脚本中进行模式匹配后打印某些内容?

问题描述

我的输入文件数据

 public class XXX
{
   private String XX ="";

   @Override
   public void toString(){
   }
}

awk /public void toString/{print nitin}

像这样输出

public class XXX{

   private String XX ="";

   @Override
   nitin
   public void toString(){
   }
}

但我想要

public class XXX{

   private String XX ="";

   nitin
   @Override
   public void toString(){
   }
}

在模式匹配中,如果我使用@override,那么它将编辑@override 的其他方法。

请建议我如何实现这一点。

标签: awk

解决方案


考虑到您的输入文件和所需的输出,这对我有用:

/@Override/ {
  override = 1;
  override_string = $0; # @Override might be indented at various levels
  next;
}

override && ! /public void toString/ {
  print override_string;
  print $0;
  override = 0;
  next;
}

override && /public void toString/ {
  # Get indent
  match($0, /^\s*/, matches);
  indent = matches[0];

  printf("%s%s\n", indent, "nitin");
  print override_string;
  print $0;

  override = 0;
  next;
}

{
  print;
}

这是使用getline的替代解决方案:

/@Override/ {
  getline nextline;
  if(nextline ~ /public void toString[(]/) {
    match($0, /^\s*/, matches); # get indent
    indent = matches[0];
    printf("%s%s\n", indent, "nitin");
    print $0;
    print nextline;
    next;
  } else {
    print $0;
    print nextline;
    next;
  }
}

{
  print;
}

推荐阅读