grep: デュアルキャプチャを使用した複数行パターンの検出

grep: デュアルキャプチャを使用した複数行パターンの検出

いくつかの単純な無限ループを含むtest.sというファイルがあります。

.LBB7_7:
        branch .LBB7_7

ラベルは完全に異なる場合がありますが、すべて.LBB\d_\d+のように見えます。

私はgrepまたはsedの1行でこれを行うための賢い方法が欲しいです。

今それが私がすることです。まず、すべてのラベルを計算します。

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

次に、bash for ループで下の行のラベルを見つけてgrep -A1 "^.$i:"出力を確認します。branch $i

もっとうまくいくことができますか(明示的なbash処理なしでgrepを使用できます)?

ベストアンサー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無限ループ条件の確認

おすすめ記事