我有一个文件,比如 test.s,其中包含几个简单的无限循环:
.LBB7_7:
branch .LBB7_7
标签可能完全不同,但都像 .LBB\d_\d+
我想要一些巧妙的方法来使用 grep 或 sed 一行来处理此类事情。
现在我就是这样做的。首先我计算所有标签:
grep -oP 'branch .\KLBB\d_\d+' minimize.s
然后在 bash for 循环中,我查找下面一行的标签grep -A1 "^.$i:"
并检查其输出branch $i
我可以做得更好(仅使用 grep 无需显式 bash 处理)吗?
答案1
尝试这个:
$ cat ip.txt
foo
baz
.LBB7_7:
branch .LBB7_7
xyzyadsf
.LBB8_3:
mov a, b
branch .LBB8_3
nop
$ grep -zoP '(\.LBB\d_\d+):\s*branch\h+\1\n' ip.txt
.LBB7_7:
branch .LBB7_7
-z
将使用 ASCII NUL 作为记录分隔符而不是默认的换行符。假设您的输入没有 NUL 字符,这将导致整个文件被吞掉(\.LBB\d_\d+)
捕获标签,但无法指定在行首匹配:\s*branch\h+\1\n
检查无限循环的条件