SEDを使用してコメントセクションのコメントを置き換える方法

SEDを使用してコメントセクションのコメントを置き換える方法

次に始めるファイルがあるとしましょう。

    /*********************************************************
    blah blah blah
    blah blah blah
    blah blah blah
    *********************************************************/
    Actual code follows here
    code 
    code 
    code

私が使用したコマンドは次のとおりです。

    sed -i 's/(/*).*(*/)/\1 newcomment \2/1' file

しかし、エラーメッセージが表示されました。

    sed: -e expression #1, char 14: unknown option to `s'

PS私の質問は...「どうしようもなく…」コメントを他のブロアブロアブロアコメントにどのように変更できますか?

ベストアンサー1

以下を使用すると簡単ですperl

perl -0777 -pi -e 's{/\*.*?\*/}{/* new comment */}s' file.c

/*...*/新しいコメントの最初の項目が置き換えられます。

sed-z一度に1行ずつテキストを処理するため、パターンスペースに追加の行を追加しない限り(または最新バージョンのGUNを使用してsed)、複数行のテキストを一致させることはできません。

sed -zi 's|/\*.*\*/|/* new comment */|' file.c

または移植可能(短いファイルと仮定):

sed -e :1 -e '$!{N;b1' -e '}' -e 's|/\*.*\*/|/* new comment */|' file.c

しかし、貪欲ではない演算子はsedサポートされていないので、最初の発生から始まります*?perl/*最後発生するために*/置き換えられます。/* comment 1 */ some C code /* comment 2 *//* new comment */

これを行うsedことは可能ですが、もっと痛いでしょう。バラよりここたとえば(これは/*内部発生"strings"やその他の警告も防ぎます)。

このソリューションに対応する単純化された内容perlは次のとおりです。

sed '
  # load the whole file into the pattern space
  :1
  $!{
    N;b1
  }
  s/_/_u/g;s/>/_c/g; # use _ as an escape character to escape
                     # the > we will be using in place of */
  s|\*/|>|g; # replace */ with >
  s|/\*[^>]*>|/* new comment */|
  s|>|*/|g; # undo the replacement and escaping
  s/>/_c/g;s/_u/_/g' file.c

GNUを使用すると、awk次のことができます。

awk -v RS='\\*/' '
  !found && sub(/\/\*.*/, "/* new comment ") {found = 1}
  {printf "%s", $0 RT}' file.c

おすすめ記事