正規表現はこれにアプローチする良い方法ではありません。複数行の検索にはうまく対応できず、表現できるパターンに制限があります。たとえば、任意のネストをregexenで指定することはできません。
この問題に取り組む適切な方法は、Cコードの条件付きコンパイルディレクティブを処理するように設計されたツールを使用することです。これは、コンパイラのCプリプロセッサ、または次のような専用ツールになりますunifdef
。
$ unifdef -UDEBUG file.c | grep printf
printf(some_parameters); // This should match
printf(some_parameters); // This should also match
マニュアルから:
UNIFDEF(1) BSD General Commands Manual UNIFDEF(1)
NAME
unifdef, unifdefall — remove preprocessor conditionals from code
SYNOPSIS
unifdef [-ceklst] [-Ipath -Dsym[=val] -Usym -iDsym[=val] -iUsym] ... [file]
unifdefall [-Ipath] ... file
DESCRIPTION
The unifdef utility selectively processes conditional cpp(1) directives.
It removes from a file both the directives and any additional text that
they specify should be removed, while otherwise leaving the file alone.
The unifdef utility acts on #if, #ifdef, #ifndef, #elif, #else, and #endif
lines, and it understands only the commonly-used subset of the expression
syntax for #if and #elif lines. It handles integer values of symbols
defined on the command line, the defined() operator applied to symbols
defined or undefined on the command line, the operators !, <, >, <=, >=,
==, !=, &&, ||, and parenthesized expressions. Anything that it does not
understand is passed through unharmed. It only processes #ifdef and
#ifndef directives if the symbol is specified on the command line, other‐
wise they are also passed through unchanged. By default, it ignores #if
and #elif lines with constant expressions, or they may be processed by
specifying the -k flag on the command line.