Shell各種コメントを削除するスクリプト

3693 ワード

Shell各種コメントを削除するスクリプト
1.txt内容:
file content
  aabbcc<<abcdefg
hilkdifdfdf
mmmmmmmm
eeeeeeeeeeeeee
  comment part 2>>>
  ddeeff
sed -e ":begin;/<<>>/{/>>>/! { $! { N; b begin }; }; s/<<<.*>>>//; };"1.txt
file content
  aabbcc
  ddeeff
  • まず括弧{}はコマンドブロックの始まりを表し、cの文法に似ているので、後で言わない.
  • :begin、これは1つの記号で、manの中でlabelと呼ばれて、つまりジャンプマーク、bとtコマンド用に供して、この例ではbコマンドを使用しました.
  • /<<</,/>>>/、これはアドレス範囲(Addresses)であり、後の{}のコマンドはアドレス範囲間のコンテンツのみに使用される.ここで、カンマの前の部分は開始アドレスであり、カンマの後ろには終了アドレスであり、正規表現である.sedは「ストリーム」式の「行」処理であるため、終了アドレスは省略可能であり、すなわち、アドレスの終了範囲が存在しない場合、ファイルの最後まで処理される.本例では,このアドレス範囲を用いるのは主に処理のデータ量を縮小することである.なぜなら,後でNコマンドで1行に対する処理を複数行に拡張するが,ファイルの先頭から<<が現れるまでbufferで処理する文字列が長くなり,効率に影響を及ぼす可能性があるからである.したがって、この処理範囲を外すことも正しい結果を得ることができる、
  • .
  • 、例えば:
    $ sed -e ":begin; { />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
    or
    $ sed -e "{:begin;  />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
    
  • />>>/!>>>は、コンテンツを置換する終了フラグであり、!は、1行の処理が完了した後、終了フラグが発見されなかった場合である.
  • $!$は正則で文字列の末尾を表し、sedではファイルの最後の行を表し、本文と前の文を結合すると、本行に終了フラグが発見されず、現在スキャンされている行がファイルの最後の行ではない場合を意味する.
  • N;は、次の行の内容をバッファに追加(append)した後、我々の例では、aabbcc<<<comment part 1の行の内容を処理する際にここまで実行し、次に次の行の内容comment part 2>>>を共にバッファに入れ、「マージ」が1行になったことに相当します(sedのバッファにはデフォルトで1行の内容しか含まれません).
  • b beginは、終了フラグ<<<がまだ見つかっていないため(前述のバッファがまだ処理されていないことに注意)、ここで符号beginに戻り、コマンドを再開する.開始タグと終了タグの間に複数の行が間隔を置いていると、何度もジャンプが発生します.
  • s/<<<.*>>>/COMMENT/;、ついに、/>>>/!はマッチングに成功しません.つまり、終了フラグを見つけました.では、sコマンドで置き換えます.開始タグと終了タグが1行にあると、上記の複雑な処理を越えて、ここまで直接実行されます.タグcのコメントを削除するには、次のコマンドsed-e":begin;{/*//!{$!{N;b begin};s//*.*///;};2.txt2.txtの内容は以下の通りである:file content aabcc/*comment part 1 abcdefghilkdifdfdfmmmmmmmmmmeeeeeeeeeeeeeeeee comment part 2*/ddeeff実行コマンドの結果は以下の通りである:file content aabcc ddeeff sed'/*/{/*//d;:a;N;/*//d;ba};s,//.*,,' 2.txtは上のaabccの行を削除して上の命令を注釈の複数行に適して、コードと注釈の行は1行になくて、sed-e":begin;{/*//!{$!{N;b begin};};s///*.*///;};"空の行が発生する可能性があります.次の場合でも問題ありません.file content aabcc/*comment part 1 a b cdefghilkdifdfdfmmmmmmmmmmeeeeeeeeeeeeeeeeeee comment part 2*/ddeeffはsed-e":begin;{/*//!{$!{N;b begin};s//*.*//;;;;;」を実行します.結果はfile content aabcc ddeeffでも空行があるので、Cコメントを削除するにはsed-e":begin;{/*//!{$!{N;b begin};;;;s/*.**///;};」適切で、空白行を削除すると
  • になります.
  • sed/^$/d filename空行を削除し、実際のアプリケーションでは-eパラメータを-iに変更することができ、ソースファイルを直接操作したり修正したりすることができます.以下は、各種ラベルcとc++を削除し、shellスクリプト自体のコメント#のスクリプト#delete the comment line begin with'//comment'sed-i"/^[\/////d]$filename#delete the commnet line end with'//comment'sed-i"s///[^]*//"$filename#delete the comment only occupied one line'/*commnet*/'sed-i"s//****/////////////////////////////////////////////////////////////////////////////////////////"$filename   #delete the comment that occupied many lines '/*comment#                                              *comment#                                              */sed -i "/^[\t]*\/\*/,/.*\*\//d"test.confsed -i 's#\#.*# #' $filenamesed -i ":begin; {/\*\//! { $! { N; b begin }; }; s/\/\*.*\*\///; };"  $filenamesed -i '/^$/d' $filename