正規表現 \/\*(.|\n)*?\*\/ を使用して各 C 複数行コメントを選択しましたが、SED では機能しません。

正規表現 \/\*(.|\n)*?\*\/ を使用して各 C 複数行コメントを選択しましたが、SED では機能しません。

たとえば、Cスタイルの複数行コメントを一致させる必要があります。

#include <stdio.h>

int main()
{
    // this is a dummy function
    float sum = 0;
    // testing the sed commands
    
    int x = 6; // single-line comment
    x = x + 5;
    
    char y = 'n'; /* end of c  *
    file */
}

複数行コメントをすべて削除する必要があります。

だから使ってみましたがsed s/\/\*\(.\|\n\)*\?\*\///ダメですね。 :/に変更しようとしましたが、まだ機能しません。%s%\/\*\(.\|\n\)*\?\*\/%%

誰でもこの正規\/\*(.|\n)*?\*\/表現の操作を指示するのに役立ちますかsed

ベストアンサー1

Sedは、\n末尾の改行()文字で定義された「レコード」(行)を処理します。これは、過去のaを一致させることができないことを意味します。\nなぜなら、それに関する限り、sedtheは\nレコードの終わりだからです。 GNUではslurpファイルを使用し、ファイル全体を単一のレコードとして扱うことでこの問題を解決sedできます(ファイルにNULL()がない場合はファイルごとに1つのレコードが定義されます)。-z\0\0

$ sed -zE 's|/\*.*\n.*\*/||' file.c 
#include <stdio.h>

int main()
{
    // this is a dummy function
    float sum = 0;
    // testing the sed commands
    
    int x = 6; // single-line comment
    x = x + 5;
    
    char y = 'n'; 
}

ただし、同じファイルに複数行のコメントがあると、sed貪欲ではない一致を作成できないため、失敗するため、常に検索しようとします。最長可能な一致、つまり/*最初から最後まで一致することを意味します*/。したがって、次のように貪欲ではないマッチングを実行できるツールを使用してくださいperl

$ perl -0777 -pe 's|/\*.*?\n.*?\*/||gs' file.c 
#include <stdio.h>

int main()
{
    // this is a dummy function
    float sum = 0;
    // testing the sed commands
    
    int x = 6; // single-line comment
    x = x + 5;
    
    char y = 'n'; 
}

ただし、コメントが1行しかないと/* */失敗します。私が考えることができる最も安全な方法は、これを行うために正規表現を使用することを忘れて、代わりに開いているコメントタグと閉じたコメントタグの数を記録し、それに応じて削除する小さなスクリプトを書くことです。

/*もう一つの問題は、orを持つ文字列も*/それを破ることができるということです。例えば、次のようなものがあるとしたらどうでしょうか?

char foo [ ] = "A comment starts with /*";

結局のところ、唯一の安全な方法はこの回答渡すエドモートンCプリプロセッサを使用してください。

これがCファイルにある場合は、他のツールと一緒にCプリプロセッサを使用して#defineまたは#include拡張などの特定のプリプロセッサ機能を一時的に無効にする必要があり、他のすべての方法は極端な場合に失敗します。これはすべての場合に機能します。

[ $# -eq 2 ] && arg="$1" || arg=""
eval file="\$$#"
sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" |
          gcc -P -E $arg - |
          sed 's/aC/#/g; s/aB/__/g; s/aA/a/g'

これをシェルスクリプトに入れ、解析するファイル名で呼び出します。オプションで適用する C 標準を指定するには、「-ansi」などのフラグを前に付けます。

バラよりhttps://stackoverflow.com/a/35708616/1745001もっと学ぶ。

おすすめ記事