複数行の印刷ドアをコメントアウトする迅速で簡単な方法

複数行の印刷ドアをコメントアウトする迅速で簡単な方法

複数行の印刷ドアをコメントアウトするための迅速で簡単な方法はありますか?このような?

                printf("3387 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n", 
                strings_line_tokens[lower_bound_of_big_boy_counter]);

私は主に3つあり、散発的に4番目を持っています。

            printf("3402 checking return stuff \n");
            printf("3408 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n", 
            strings_line_tokens[lower_bound_of_big_boy_counter]);
            printf("3410 function_type_for_proper_return %s \n", function_type_for_proper_return);

今回が4番目の散発的事件だ。場合によっては、%cifステートメントまたはwhileループが期待どおりに機能しない理由を見つけるのに役立ちます。

        printf("2340 symbol_table_variables[i][1] is %s.\n", symbol_table_variables[i][1]);
        printf("2341 symbol_table_variables[i][2] is %c.\n", symbol_table_variables[i][2][0]);

もっと複雑になる :)。これら2種類の印刷明細を別々に保管できますか?

        printf("2434 REJECT\n");
        printf("2534 ACCEPT\n");

ベストアンサー1

「次のメンバーを処理する」と言うのは意味がありません。これ1つの方法でグループ化して処理 この他のグループ別の方法で変更してください。 「あるグループを1つの方法で処理し、他のすべてのグループが別の方法で処理するように指定する必要があります。したがって、あなたが望むと仮定します。みんな printfコメントアウトされたステートメントを除いて、次のいずれかに似ています。

        printf("2434 REJECT\n");
        printf("2534 ACCEPT\n");

したがって、「簡単な」ソリューションは次のとおりです。

awk '
        /printf/        { comment=1 }
        /printf\("[0-9]* REJECT/    { comment=0 }
        /printf\("[0-9]* ACCEPT/    { comment=0 }
                        { if (comment) printf "//"
                          print }
        /;/             { comment=0 }
'

その機能は次のとおりです。

  • 埋め込みラインを見るたびにフラグをprintf設定します。comment(これはfprintfとの呼び出し呼び出しと一致しますsprintf。また一致します。コメントそしてひもprintfたとえば、;という単語が含まれています。
            / *このprintfは、ifステートメントが何をしているのかを調べるために使用されます。 */
    もっと具体的に書く必要がある場合は、調整してください。 )
  • printfその後、数値文字列とスペース、REJECTorACCEPTが続くことが判明した場合去るこれはcomment、これらの文がコメントアウトされたくないためです。この正規表現は少し広いことに注意してください。乱数数字(4つだけではありません)を入力し、その単語が行の最後の単語であることを確認しません。より具体的に説明する必要がある場合は、調整してください。
  • 次に、各入力行に対して2行のコードブロックを実行します。
    • このフラグが設定されると、行をコメントアウトするために記録commentされます。 Cと同様に、inは//自動的に改行文字を書きません。awkprintf
    • 次に、各行に対してその行を書き込みます。 (awkprint記載する最後に改行文字を自動的に書き込みます。デフォルトは入力行を出力に書き込むことです。 )したがって、これは入力ラインを出力に書き込み(ステートメントの1つではなく)、ステートメント//の一部である場合はコメントを付けます。printf
  • その後、セミコロンが表示されたらフラグをオフにしますcomment。これにより、comment複数行の文の処理中にフラグがセットされたままになります。printfそのため、printf文字列にセミコロンを含めないことが重要です。awkスクリプトがセミコロンを問い合わせの終わりに間違えているからです。

たとえば、入力の場合

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
        strings_line_tokens[lower_bound_of_big_boy_counter]);
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
        printf("3402 checking return stuff\n");
        return_match_flag = 1;
    }

この出力を生成します

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
//    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
//    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
//        strings_line_tokens[lower_bound_of_big_boy_counter]);
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
//        printf("3402 checking return stuff\n");
        return_match_flag = 1;
    }

目的の出力が何であるかを正確に説明していません。各行の先頭にこれを配置することは、//コードをコメントアウトする簡単な方法です。/*最初の行の前と*/最後の行の後に置くことをお勧めします。/*…*/注釈付きコード内のすべてのスタイル注釈が注釈を終了するため、自動化スクリプトではこれを行わないことをお勧めします(/*…*/スタイル注釈は入れ子になっていないため)。確信する探す */コメントアウトされたコードでは汚れている可能性があります。

しかし、Cコードブロックをコメントアウトする別の方法があります。間の何でも

#if 0

そして

#endif

コンパイラに関する限り、デフォルトではソースコードファイルから消えます。これで爆発しますが重なる 他のプリプロセッサ(#…)ブロックと一緒に見事にネストされます。私たちが#if 0書く前にすべて printfドアは、#endifその後印刷ドアブロックを検出する方が良いと思います。だから私はこれを思い出しました。

awk '
        /printf/        { starting_comment=1 }
        /printf\("[0-9]* REJECT/    { starting_comment=0 }
        /printf\("[0-9]* ACCEPT/    { starting_comment=0 }
                        { if (starting_comment) {
                                starting_comment=0
                                if (in_a_comment==0) print "#if 0"
                                in_a_comment=1
                          }
                          if (in_a_comment==2) {
                                print "#endif"
                                in_a_comment=0
                          }
                          print
                        }
        /;/             { if (in_a_comment==1) {
                                in_a_comment=2
                          }
                        }
        END             {
                          if (in_a_comment==2) {
                                print "#endif"
                                in_a_comment=0
                          }
                        }
'

おそらく、このブロックは実際には必要ありませんEND。入力の最後の行がステートメントの場合にのみ機能しますprintf。もちろん、Cソースコードファイルの最後の行は常に}

上記の入力例の場合、これは次のようになります。

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
#if 0
    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
        strings_line_tokens[lower_bound_of_big_boy_counter]);
#endif
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
#if 0
        printf("3402 checking return stuff\n");
#endif
        return_match_flag = 1;
    }

printf最初の2つのステートメントがどのようにブロックに結合されるかを確認してください。

おすすめ記事