sedを使用してCスタイルのコメントをC ++スタイルに変換する

sedを使用してCスタイルのコメントをC ++スタイルに変換する

1行の「C」スタイルのコメントを「C ++」スタイルに変換しようとしています。下の「sed」は悪くありませんが、先行コード(コメントの前のコード)に「/」があると当然失敗します。

sed -i 's,\(^[^\/]*\)\/\*\([^\*]*\)\*\/[ ]*$,\1\/\/\2,' filename

私ができることを望むのは次のとおりです。

... [^\\/\\*] ...

つまり、「/*」を否定することはもちろん機能しませんが、数時間検索しても見つかりません。シンプルこれを正しく行う方法を説明してください(これはロケット科学ではないようです)。

たとえば、次の文字列は次のようになります。

blah blah        /* comment */
blah blah / blah /* comment */
blah blah        /* comment */ blah
blah blah / blah /* comment */ blah 

...次のように変換する必要があります。

blah blah        // comment 
blah blah / blah // comment 
blah blah        /* comment */ blah  (this CAN'T be converted)
blah blah / blah /* comment */ blah  (this CAN'T be converted)

...明らかに「C」コメントの後にコードがある場合、変換は発生しません。

ファイルの前後を注意深く視覚的に比較するので、テキストで「/*」を処理する必要もなく、複数行の内容を変換したくありません。

私はこれが「否定的な」質問だと思いますが、おそらく他の方法があるかもしれないことに注意してください。 「/*」より前のすべての項目をキャプチャするだけです。方法は関係ありません。

以下の答えに従ってください

クソ!私は基本的なことを完全に誤解したことを発見しました。

.*/\*

...読む:「スラッシュアスタリスクの後にスラッシュアスタリスクが続くことを除くすべて」、だから実際に「neg」を無料で取得します:-)

したがって、バルマーよりも一歩進んだ。

sed -i 's,^\(.*\)/\*\(.*\)\*/\s*$,\1//\2,' filename

...でもこれをキャッチします:

blah / * blah        /* co / mme * nt */

そして出力:

blah / * blah       // co / mme * nt 

啓発。

答え1

この試み:

sed 's,^\(.*\)/\*\([^/]*\)\*/$,\1//\2,'

/埋め込み文字を含むコメントは変換されません。または、次のものを使用できます。

sed 's,^\(.*\)/\*\(.*\)\*/$,\1//\2,'

同じ行に2つのコメントがあると、間違ったことになります。

blah blah        /* comment1 */ blah /* comment2 */

に変換されます

blah blah       // comment1 */ blah /* comment2

否定的な予測を使用して埋め込みコメントをテストできるため、PCREバージョンを使用する方が良いかもしれませんsed

また、,コマンドで区切り文字として使用することは、正規表現のすべての文字をsエスケープする必要がないことを意味します/。これは/正規表現に/

答え2

おそらく最も安全なアプローチは、影響を与えない行を最初にテストし、一致するb場合はスクリプトを終了することです。

sed '\|\*/.*/\*|b'

*すべてのアスタリスクが含まれているため、読み取りは少し難しいですが、デフォルトで/*ifが発生した後は、*/ sedスクリプトの実行を終了して自動的に行を印刷してから、次の行を引いて次の行ループを開始します。一致する行の場合、それに続くコマンドは実行されません。

別の方法はestを使用することです。これはt、交換が成功した後に牧草地タグが提供されない限り、bスクリプトでも同じことを行います。bs///

sed 's|/\*|&|2;t'

行で2番目に表示されるパターンを自分のパターンに置き換えようとし、成功すると同じ方法で分岐しますb

だから...

sed 's|/\*|&|2;s|\*/|&|2;t
     s|/\*\(.*\)\*/ *$|//\1|'

/*...末尾の空白文字の数に関係なく、終わる行の最初で//唯一の出現を置き換えます。*/これは、以前に発生したすべての置換に適用されるために機能するため、tどちらかがt成功するとsed分岐します。

しかし、私はCやC ++に慣れておらず、この場合何を期待するのかわからないので、ここで間違いを犯している可能性があります。/\*.*\*/.*\*/上記のスクリプトは2つだけテストする必要がbあるかもしれません。しかし、少なくとも私はこの概念をよりよく知っている人に伝えることを願っています。*//*

答え3

偶然上記の内容が必要でしたが、複数行も必要でした。それで、Barmarの答えを私自身のいくつかのsedとマージしてこれを達成しました。

sed -e '/\/\*/,/\*\//{s/^\( *\)\/\*/\1~~/g;s/^\( *\) \*\//\1~~/g;s/^\( *\) \*/\1~~/g;s/~~/\/\//g};s/\*\*/\/\//g;s,^\(.*\)/\*\(.*\)\*/\s*$,\1//\2,'

(しかし、Macではgsedが必要です。そうしないと上記のエラーが発生します)

前/後の違いです

***************
*** 1,13 ****

! /*
     FOO
!  */

! /*
!  * BAR
!  */

! blah blah        /* comment */
! blah blah / blah /* comment */
  blah blah        /* comment */ blah
  blah blah / blah /* comment */ blah
--- 1,13 ----

! //
     FOO
! //

! //
! // BAR
! //

! blah blah        // comment
! blah blah / blah // comment
  blah blah        /* comment */ blah
  blah blah / blah /* comment */ blah

関連情報