11

コメントが/*で始まり、* /で終わる場合、すべてのコメントを削除するにはどうすればよいですか。次のことを試しました。1行のコメントで機能します。

sed '/\/\*/d' 

ただし、複数行のコメントは削除されません。たとえば、2行目と3行目は削除されません。

/*!50500 PARTITION BY RANGE (TO_SECONDS(date_time ))
 PARTITION 20120102parti VALUES LESS THAN (63492681600),
(PARTITION 20120101parti VALUES LESS THAN (63492595200) */ ;

上記の例では、最後の;を保持する必要があります。クロージングコメントサインの後。

4

7 に答える 7

18

これがを使用する1つの方法GNU sedです。のように実行sed -rf script.sed file.txt

内容script.sed

:a
s%(.*)/\*.*\*/%\1%
ta
/\/\*/ !b
N
ba

または、これが1つのライナーです。

sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' file.txt
于 2012-10-25T05:22:17.553 に答える
13

これがCファイルにある場合は、他のツールと組み合わせてCプリプロセッサを使用して、#definesや#includesの展開などの特定のプリプロセッサ機能を一時的に無効にする必要があります。エッジの場合、他のすべてのアプローチは失敗します。これはすべての場合に機能します。

[ $# -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を参照してください。

于 2012-10-25T06:17:46.330 に答える
8

これはする必要があります

 sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d'

テスト用:

a.txt

/* Line test
multi
comment */
Hello there
this would stay 
/* this would be deleteed */

指示:

$ sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d'
Hello there
this would stay 
于 2012-10-25T05:00:09.243 に答える
3

これはあなたのために働くかもしれません(GNU sed):

sed -r ':a;$!{N;ba};s|/\*[^*]*\*+([^/*][^*]*\*+)*/||' file

とにかく、それは始まりです!

于 2012-10-25T07:07:13.317 に答える
2

Edの回答(Cファイルに焦点を当てた)を補足するために、C以外のファイル(PL / SQLファイルなど)用にBrianHilesが作成した優れたsedスクリプトremccoms3.sedをお勧めします。CおよびC++(//)コメントを処理し、文字列内のコメントを正しくスキップします。スクリプトはここから入手できます:http ://sed.sourceforge.net/grabbag/scripts/remccoms3.sed

于 2013-09-26T14:42:31.613 に答える
0

これを試して

sed "/^\//,/\/;/d" filename
于 2014-05-30T15:55:43.573 に答える
0

唯一のsed解決策:

sed -r 's/\/\*(.*?)\*\///g' \
    | sed -r 's/(.+)(\/\*)/\1\n\2/g'\
    | sed -r 's/(\*\/)(.+)/\1\n\2/g' \
    | sed '/\/\*/,/\*\// s/.*//'

欠点:複数行のコメントでは空の行が残ります(超人的な努力をしない限り、sedは行ベースであるため)。

説明

  • s/\/\*(.*?)\*\///g1行のコメントを処理します。
  • s/(.+)(\/\*)/\1\n\2/gs/(\*\/)(.+)/\1\n\2/g複数行のコメントの最初と最後で行を分割します。
  • /\/\*/,/\*\// s/.*//コマンドを実行すると、パターンと-s/.*//の間のすべての行が効果的に削除されます。これはエスケープされます。\/\*\*\//**/
于 2018-12-19T12:23:05.880 に答える