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
エスケープする必要がないことを意味します/
。これは/
正規表現に/
。