基本スクリプト

基本スクリプト

Androidアプリがあり、Log.d(.....);削除したい種類のメッセージがたくさんあります。

私はそれらをすべて削除するコマンドが必要です(すべてのディレクトリを再帰的に渡す必要があります)

しかし、1つの問題は、いくつかのLog.dコマンドが次の行に移動するため、いくつかのコマンドは次のようになることです。

Log.d("I can be easily deleted", "");

他の人もみんな

Log.d("I span a new line, "hel" 
+ "lo");

また、間隔がすべて同じである必要はありません。 1つは行Log.dの先頭から30文字、もう1つは14文字などです。

Log.d私は彼らがすべてで始まり、そして終わるのが役に立つと思いました。);

これは、すべての.javaファイル(* .java)でのみ実行する必要があります。

これを行うコマンドは何ですか?ありがとう

ベストアンサー1

基本スクリプト

(sedとは異なり)複数の行を一致させる方が簡単なので、Perlを使用します。デフォルトのスクリプトは次のとおりです。

perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input

説明する

  • perl -0777 -pe:Perlを呼び出して-0777ファイル全体を読み込み、複数行の処理を許可します。
  • 's/foo/bar/gm':一致する項目が複数ある場合でも、fooに置き換えられます()。これは複数行表現です()。bargm
  • ^Log\.d\(.*?(\n.*?)*?\);\n:;で始まる行を見つけますLog.d(。式をエスケープする必要があります(^Log\.d\()。この後にはより多くの文字があるかもしれません()、.*?より多くの文字を含む改行文字があるかもしれません()、(\n.*?)最後の式*?が何度も繰り返されるかもしれません()。次に、終了者);の後に改行文字(エスケープ)が続くことを見つけます\);\n。これらのワイルドカードはすべて欲張りではありません(*?not *)。したがって、^Log\.d\(ファイル全体の先頭から最後まで削除するのではなく、できるだけ少ない文字数を一致させようとします。\);\n

テスト

input.txt:

Keep me A
Log.d("I can be easily deleted", "");
Keep me B
Keep me C
Log.d("I span a new line, "hel" 
+ "lo");
Keep me D

スクリプトを実行します。

$ perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input.txt
Keep me A
Keep me B
Keep me C
Keep me D

複数のファイルを繰り返す

上記のようにスクリプトをテストしたら、複数のファイルに適用してみてください。-iソースファイルを変更するには、Perlの「in-place」オプション()を使用してください。まずディレクトリをバックアップします。ファイルがすべて同じディレクトリに直接存在する場合は、シェルワイルドカードを使用して複数のパラメータをスクリプトに送信できます。

perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' *.java

しかし、おそらくネストされたディレクトリがあることを考慮すると(そしてどのシェルを使用しているのかわかりません)、findここで使用できます。

find /path/to/dir -name '*.java' -execdir perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' {} \;

説明する

  • find /path/to/dir:見てください/path/to/dir
  • -name '*.java':この式に一致するファイルのみを探します。
  • -execdir perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' {} \;-i:一致するファイルで上記のスクリプトin-place()を実行します{}

man findこの形式の詳細を確認してください。

sedバージョンベンチマーク

〜のようにドンクリスティ以下をお勧めします。コメント、これも実行できるsedコマンドがあります。

sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input.txt

次のファイルを入力として使用して、両方のコマンドをテストしました。

Keep me A
Log.d("I can be easily deleted", "");
Keep me B
Keep me C
Log.d("I span a new line, "hel" 
+ "lo");
Keep me D
Log.d("I span a new line, "hel" 
+ "lo" +
+ "there");
Keep me E

コマンドを比較するいくつかのベンチマークを実行しました。私のシステムでは、perlこのファイルのバージョンは少し高速です。

$ time (for i in {1..1000}; do perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input.txt > /dev/null; done)

================
CPU 101%
user    1.484
system  3.372
total   4.793
$ time (for i in {1..1000}; do sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input.txt > /dev/null; done)

================
CPU 101%
user    2.647
system  2.847
total   5.429

input.txt上記の内容を1000回繰り返す別のテストファイルも作成しました。この場合、sedバージョンはより高速です。

$ time (for i in {1..100}; do perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input1000 > /dev/null; done)

================
CPU 100%
user    1.132
system  0.409
total   1.535
$ time (for i in {1..100}; do sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input1000 > /dev/null; done)

================
CPU 100%
user    0.560
system  0.298
total   0.853

おすすめ記事