2017-03-04 3 views
0

タグの先頭にコメントをコメント解除するためのbashスクリプトを作成しています。 ex;シェルスクリプトで<ex></ex>のような開始タグと終了タグを含むファイルから文字列を削除

/*<O33>*/ 
    // here my code 
/*</O33>*/ 

ここにスクリプトがあります。コメントは正常に終了しました。

sed -i "/^[ \t]*\/\*<O33>\*\//,/^[ \t]*\/\*<\/O33>\*\//s/\/\///g" $Path/DebugVersion.c 

、これが結果です:

/*<O33>*/ 
     here my code 
/*</O33>*/ 

は今、私は開始タグと終了タグの間の文字列をrecommentし、プロセスを逆にしようとしているが、私は何をするのか分かりませんそれ。

+0

は、コードがCまたはC++の場合は、マクロ名のいずれかの適切な選択のために(始めと終わりをマークするために '#ifdefのDEBUG_WANTED'と'#のendif'を使用する必要があります新しい結果 – RomanPerekhrest

+0

をどのように見えるべきかを示して)。次に、デバッグコードを追加または削除するコードを編集する必要はありません。コマンド行で '-DDEBUG_WANTED'またはそれと同等のものを使用するかどうかで再コンパイルするだけです。 –

+0

大文字Oの後に数字33を選択すると、誤った解釈が行われることがあります。これはタグ名の良い選択ではありません。 –

答えて

0

開始点と終了行に//マーカーを挿入したくないため、コメントを再挿入する作業はややこしいです。

\@/\*<O33>\*/@, \@/\*</O33>\*/@ { 
    \@/\*</\{0,1\}O33>\*/@ ! s%\([[:space:]]*\)%&//% 
} 

私はその後、走っ:

$ sed -f script.sed data 
/*<O33>*/ 
     //here my code 
    /*</O33>*/ 
$ 

をあなたのパターンマッチングが一致する材料で/*の存在によって複雑になる私が含まれているファイル、script.sed、になってしまいました。この場合、sedの検索文字をこの場合は\@に変更して、@がパターンの最後を示していることを伝えます。 (あなたが便利だ他の文字を選択することができます。あまりにもよく=または%仕事を)最初の行は最初のパターンが/*<O33*/(大文字Oであるノート、ゼロではない)と探しフォームpatt1, patt2{を持っています秒は/*</O33>*/を探します。 {は、コマンドのグループ化を開始します。これは、第1のパターンから第2のパターンまでの範囲のラインが、一致する中括弧{ ... }に含まれるコマンドを受けることを意味する。

2行目には、両方の識別を開始するためのパターンマッチでわずかに異なる変異体を使用し、エンドライン(/\{0,1\}/の0または1のインスタンスを見つける古典sed方法であり、あなたが現代の拡張正規表現を使用する場合、それは同等です〜/?)。 !演算子は一致の意味を反転させます。終了タグと一致しない行だけがs%%%置換の対象となります。これにより、たとえば/*<O33>*/の前に//を挿入することを回避します。

s%\([[:space:]]*\)%&//%操作では、0個以上の先頭の空白文字(空白またはタブ)が検索され、その後に//が追加されます。この場合も、s///の使用は避けます。/が置換テキストの一部です。

これは、別々のスクリプトファイルを必要とするのではなく、すべて1行に詰め込むことができますが、私はシェルと戦う必要がないのでスクリプトファイルが好きです。これは大きな問題ではない。物事を混乱させるための引用符はありません。シェル変数をスクリプトに補間する必要がないかぎり、スクリプトを一重引用符で囲みます。二重引用符を使用する必要がある場合は、バックスラッシュを二重にする必要があります。可能であれば、スクリプトを二重引用符で囲まないようにしてください。

$ sed '\@/\*<O33>\*/@, \@/\*</O33>\*/@ { \@/\*</\{0,1\}O33>\*/@ ! s%\([[:space:]]*\)%&//%; }' data 
/*<O33>*/ 
     //here my code 
    /*</O33>*/ 
$ 

末尾のセミコロンは、GNU sedではオプションです。それはBSD(macOS)と古典的なsedで必要です。

私はdecommenting sedスクリプトで、あなたが持っていることを渡すに注意してください。

s/\/\///g 

gはおそらく良いアイデアではありません。あなたが持っている場合:

/*<O33>*/ 
// printf("%s\n", __func__); // Identify the function! 
/*</O33*/ 

を次にコメントを解除操作が去る:

/*<O33>*/ 
    printf("%s\n", __func__); Identify the function! 
/*</O33*/ 

はあまりにも二コメントマーカーを取り除きます。コードはコンパイルされません。 gを削除してください。その行の最初のコメントマーカーのみを削除したいだけです。 (明らかに、//のコメントを使用してコードブロックを無効にする場合、これは重要ではありませんが、長期的には安全です)

CまたはC++でC言語で作業している場合利用可能プリプロセッサ、あなたが使用することをもっとうまくしたい:

#ifdef O33 
    printf("%s\n", __func__); // Identify the function! 
#endif 

をあなたがコードを有効または無効にするには、ファイルを編集する必要はありませんよう。 -DO33または同等のものを使用するかどうかにかかわらず、簡単に再コンパイルできます。

+0

私は私の答えを得ることはありません私は理解していませんが、私は学び、あなたの答えから多くを学ぶでしょう。 –

0

私はジョナサンの答えとSLePortの答えから学び、それを得ます。

sed -i "/^[ \t]*\/\*<O33>\*\//,/^[ \t]*\/\*<\/O33>\*\//d" $Path/DebugVersion.c 
関連する問題