grep: detecta padrão de várias linhas com captura dupla

1

Eu tenho arquivo, digamos test.s que contém vários loops infinitos triviais:

.LBB7_7:
        branch .LBB7_7

Os rótulos podem ser totalmente diferentes, mas todos são como .LBB \ d_ \ d +

Eu quero uma maneira legal de processar essas coisas com o grep ou sed one-liner.

Agora estou fazendo isso. Primeiro eu calculo todos os rótulos:

grep -oP 'branch .\KLBB\d_\d+' minimize.s

E, em seguida, no bash for loop eu estou procurando o rótulo com uma linha abaixo com grep -A1 "^.$i:" e verificando sua saída para branch $i

Posso fazer melhor (sem processamento bash explícito apenas com grep)?

    
por Konstantin Vladimirov 14.12.2017 / 10:11

1 resposta

3

tente isto:

$ 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+\n' ip.txt
.LBB7_7:
        branch .LBB7_7
  • -z usará o ASCII NUL como separador de registro em vez do caractere de nova linha padrão. Supondo que sua entrada não tenha caracteres NUL, isso fará com que o arquivo inteiro seja sugado
  • (\.LBB\d_\d+) capture label, mas não é possível especificar para combinar no início da linha
  • :\s*branch\h+\n condition para verificar loop infinito
por 14.12.2017 / 10:24