grep:使用双捕获检测多行模式

grep:使用双捕获检测多行模式

我有一个文件,比如 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检查无限循环的条件

相关内容