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
に置き換えられます()。これは複数行表現です()。bar
g
m
^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