リポジトリ内のすべてのファイルから特定の特徴的な1行のC ++コメントを削除する必要があります。コードは次のとおりです。
some_code
// characteristic_comment_to_delete
some_more_code // another_comment
another_line_with_code // characteristic_comment_to_delete
even_more_code
その結果、私はこれを得たいと思います:
some_code
some_more_code // another_comment
another_line_with_code
even_more_code
私はsedコマンドを使用して、私が望むほど良い結果を得ました。
$ sed -i -e 's&// characteristic_comment_to_delete.*&&g' some_file.cpp
some_code
some_more_code // another_comment
another_line_with_code
even_more_code
残念ながら、これらの空行を残すことは許容可能な解決策ではないため、行全体を削除するようにコマンドを何らかの形で改善する必要がありますが、この特定のコメントを削除した後にのみ空白のままにしてください。
編集:明らかにこのコマンドをrootとして実行していません。これによりプロンプトが変更されました。また、すべてのコメントを削除したくないので、私のトピックが他のスレッドと重複しているようには見えません。
答え1
Sedにはd
行全体を削除するコマンドがあります。 (非)区切り文字を使用することもできますが、/
初めて使用するときはエスケープする必要があります\
。だからあなたは次のことをすることができます
$ sed -e '\#^// characteristic_comment_to_delete$#d' -e 's#// characteristic_comment_to_delete.*##' file
some_code
some_more_code // another_comment
another_line_with_code
even_more_code
まず、完全に構成された行を削除して// characteristic_comment_to_delete
から、残りの一致を置き換えます。
(sed代替演算子との混同を避ける&
ためにあなたのものを変更しました)。#
&
答え2
GNUの使用sed
:
sed 's|\s*// characteristic_comment_to_delete.*||;T;/./!d'
T
GNU拡張です木の枝以前のs
交換が成功しなかった場合。したがって、コメントが削除されない場合は、分岐して/./!d
次のコメントをスキップします(文字が1つも含まれていない行を削除します)。
標準同等:
sed '\/[[:space:]]*\/\/ characteristic_comment_to_delete.*/{s///;/./!d;}'
または:
sed 's|[[:space:]]*// characteristic_comment_to_delete.*||
t 1
b
:1
/./!d'
両方とも置換が成功した場合にのみ空行を抑制します。
答え3
AWKソリューションを受け入れる場合:
awk -F "[ ]*//[ ]*characteristic_comment_to_delete.*" '$1 != "" { print $1; }' some_file.cpp
注:このパターンには角かっこの間にスペースとタブが含まれています[ ]
。
このソリューションは、コメントパターンを含む文字列リテラルを正しく処理しません。
char text[] = "// characteristic_comment_to_delete bla bla";
答え4
特定のコメントを削除するマイナーな作業は予想よりもはるかに複雑になりましたが、効果的なソリューションを見つけて、それを複数の個別のコマンドに分割しました。主な問題は、次のような行があることです。
another_line_with_code // characteristic_comment_to_delete#xA;more_code // characteristic_comment_to_delete // characteristic_comment_to_delete
#xA; は改行文字ですが、ファイルの作成方法は sed で 1 行で処理されます。
理論的には、良い正規表現にもかかわらず、sedがあまりに欲張っているという事実を避けることができないので、Perlを使用する必要があります。
コメントのみを含む行を削除できる最終的な解決策は次のとおりです(「d」パラメータを教えてくれたSteeldriverのおかげで、私はそれについて知りませんでした)。
$ find . -type f -print0 | xargs -0 sed -i -e '\#^// characteristic_comment_to_delete\s*$#d'
そしてインラインコメントを削除します。
$ find . -type f -print0 | xargs -0 perl -pi -e 's|\s*// characteristic_comment_to_delete\s*
||g'
+
$ find . -type f -print0 | xargs -0 perl -pi -e 's|
// characteristic_comment_to_delete\s*||g'
+
$ find . -type f -print0 | xargs -0 perl -pi -e 's|\s*// characteristic_comment_to_delete\s*||g'
これは2つのコマンドで簡単に減らすことができ、単一のコマンドですべてのケースをキャプチャすることもできますが、上記の作業は完了です。みんなありがとうございます!