sgrep
sgrep (structured grep) 使い方のメモ
http://www.cs.helsinki.fi/u/jjaakkol/sgrep.html
$ cat testfile abc this is a pen. xyz abc hello, world xyz $ sgrep '"abc" .. "xyz"' testfile # abc と xyz で囲まれた範囲を取得 abc this is a pen. xyzabc hello, world xyz $ sgrep -o '%r\n' '"abc" .. "xyz"' testfile # 出力形式を指定。改行をはさむ abc this is a pen. xyz abc hello, world xyz $ sgrep '"abc" ._ "xyz"' testfile # . を _ に置き換えると、終端が exclusive になる abc this is a pen. abc hello, world $ sgrep '"abc" __ "xyz"' testfile # 両端を exclusive this is a pen. hello, world $ sgrep '"abc" _. "xyz"' testfile # 開始だけ exclusive this is a pen. xyz hello, world xyz $ cat testfile2 printf("hogehgoe ", xyz "laskjdlaksjd"); // " kkk $ sgrep '"\"" quote "\""' testfile2 # quote を使うと、対応する " の中身をとってくる "hogehgoe ""laskjdlaksjd" $ sgrep '"\"" .. "\""' testfile2 # .. だと最長一致になってしまう "hogehgoe ", xyz "laskjdlaksjd"); // " $ sgrep '"\"" _quote_ "\""' testfile2 # _ をつけると exclusive になる hogehgoe laskjdlaksjd $ sgrep '"\"" _quote "\""' testfile2 hogehgoe "laskjdlaksjd" $ cat testfile3 hoge hoge hoge hoge $ sgrep -c '"hoge"' testfile3 # grep と違い、hoge を含む行数でなく出現回数を数えてくれる 4 $ cat testfile5 /* hogehoge /* mgemog */ */ $ sgrep '"/*" quote "*/"' testfile5 # ネストしてる場合。C コンパイラと同じ /* hogehoge /* mgemog */ $ cat testfile6 if (hogehoge != 1) { printf("lkj"); } /* if (mogemoge != 2) { printf("poi"); } */ # 「コメントやプリプロセッサディレクティブに入っていない if」から ")" まで $ sgrep '"if" not in ("/*" quote "*/" or ("\n#" .. "\n")) .. ("(" .. ")")' testfile6 if (hogehoge != 1) # 条件式に "access" を含む if 文全体。ただし main 関数の中にあり、コメントやプリプロセッサディレクティブの中にない。 sgrep '"if" not in ("/*" quote "*/" or ("\n#" .. "\n")) \ .. ("(" .. ")") containing "access" \ in ("main(" .. ("{" .. "}")) \ .. ("{" .. "}" or ";")' *.c # 以下のような m4 マクロがデフォルト定義されており、これを使うと define(BLOCK,( "{" .. "}" )) define(COMMENT,( "/*" quote "*/" )) changecom(%) define(CTRLINE,( "#" in start or "\n#" _. ("\n" or end) )) define(IF_COND,( "if" not in (COMMENT or CTRLINE) .. ("(" .. ")"))) # 同じものが簡潔に書ける sgrep -p m4 -f c.macros -e 'IF_COND containing "access"\ in ( "main(" .. BLOCK ) .. (BLOCK or ";")' *.c