次に始めるファイルがあるとしましょう。
/*********************************************************
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