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