いくつかの単純な無限ループを含む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
無限ループ条件の確認