在awk脚本中进行模式匹配后,如何打印内容?

时间:2019-12-04 11:41:19

标签: 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。

请提出如何实现此目标。

1 个答案:

答案 0 :(得分:0)

鉴于您的输入文件和所需的输出,这对我有用:

/@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;
}