匹配相距至少 N 行的两条不同的行

jak*_*b.g 3 grep sed awk

我想匹配包含try(在一行中)和连续catch(在另一行中)至少 N 行之后的文件(以找到很长的尝试捕获并尝试摆脱它们)。我的意思是,第一个 catch之后try应该是 N 行之后。

是否有使用标准 UNIX 工具(例如grep, sed, )来执行此操作的好方法awk

我尝试了两次,grep -A <number> -B <number>但它擅长相反的事情,即找到不超过 N 行的 try-catch。

fed*_*qui 5

这个解决方案怎么样?

awk -v gap=5 '
       /try/ {inside=1; a=0; next}
       inside{a++}
      /catch/ && inside && (a>=gap) {print "line",NR, "gap of",a,$0; inside=0}
' file
Run Code Online (Sandbox Code Playgroud)

解释

  • -v gap=5给出间隙大小。如果有一些 try/catch 的行距离大于这个,它们将被打印出来。
  • /try/ {inside=1; a=0; next}如果该行包含 a try,则计数器开始。inside是标志,表示我们正在检查try/catch. a是行的计数器。
  • inside{a++} 如果我们在里面,在读取一行时 ++ 计数器。
  • /catch/ && inside && (a>gap)如果该行包含“catch”并且我们处于“try”条件内并且计数器大于我们设置的值gap,则执行{print "line",NR, "gap of",a,$0; inside=0}

测试

$ cat a
hello
try
line1
catch

blabla
try
line1
line2
line3
line4
catch
end
Run Code Online (Sandbox Code Playgroud)

差距为 5:

$ awk -v gap=5 '/try/ {inside=1; a=0; next} inside{a++} /catch/ && inside && (a>=gap) {print "line",NR, "gap of",a,$0; inside=0}' a
line 12 gap of 5 catch
Run Code Online (Sandbox Code Playgroud)

间隔为 2:

$ awk -v gap=2 '/try/ {inside=1; a=0; next} inside{a++} /catch/ && inside && (a>=gap) {print "line",NR, "gap of",a,$0; inside=0}' a
line 4 gap of 2 catch
line 12 gap of 5 catch
Run Code Online (Sandbox Code Playgroud)