我想匹配包含try(在一行中)和连续catch(在另一行中)至少 N 行之后的文件(以找到很长的尝试捕获并尝试摆脱它们)。我的意思是,第一个 catch之后try应该是 N 行之后。
是否有使用标准 UNIX 工具(例如grep, sed, )来执行此操作的好方法awk?
我尝试了两次,grep -A <number> -B <number>但它擅长相反的事情,即找到不超过 N 行的 try-catch。
这个解决方案怎么样?
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)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |