0

比較的大きなプロジェクトのすべてのファイルの先頭にある複数行のライセンス通知 ( GNU GPLからApache 2.0まで)を置き換えたいと考えています。ライセンス通知は、いくつかの段落で構成されています。もう 1 つの要件は、現在のファイル名に依存するターゲット ライセンス通知内にプレースホルダーがあることです。したがって、単純な検索と置換では十分ではありません。

私はやることに精通しています:

find . -name "*.java" -exec sed -i 's/find/replace/g' {} \;

しかし、このユースケースで機能させる方法がわかりません。

アップデート:

ターゲットの Apache 2.0 ライセンスのプレースホルダーは次のようになります。

Copyright [yyyy] [name of copyright owner]
[filename.java] <br/><br/>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at<br/><br/>

http://www.apache.org/licenses/LICENSE-2.0<br/><br/>

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
4

3 に答える 3

2

clicki-buntis が必ずしも優れているとは限りませんが、そのような場合には 'kfilereplace' を使用します。これは、そのような目的のために設計された kde ツールです。正規表現をセットアップし、シミュレートされたパスを実行できます。このようにして、最初にセットアップをテストしてから、「ライブ」置換を行うことができます。

プレースホルダーの場合:

  • プレースホルダーの前後の部分を別々に置き換えて、2 つの置換を行います。そうすれば、2 つの静的文字列を置き換えるだけで済み、動的なものは何もありません。
  • 多くの正規表現置換関数が提供するプレースホルダー置換戦略を使用して、置換されるテキストの動的プレースホルダー部分を引き継ぎます。
于 2012-12-17T09:23:09.530 に答える
2

次のsedコマンドを使用して、start_patternで始まり で終わる行を削除しend_patternます。

sed -n '/start_pattern/{:a;N;/end_pattern/!ba;N;s/.*\n//};p' file

たとえば、GNU GPL ライセンスを削除するには、次のようにします。

sed -n '/GNU GENERAL PUBLIC LICENSE/{:a;N;/why-not-lgpl.html\>./!ba;N;s/.*\n//};p' file

findwithを使用して複数のファイルに対してこれを実行するには、次のようにしますxargs

find . -name "*.java" -print0 | xargs -0 sed -i -n '/GNU GENERAL PUBLIC LICENSE/{:a;N;/why-not-lgpl.html\>./!ba;N;s/.*\n//};p'
于 2012-12-17T09:28:27.270 に答える
1

パール:

# First, get the text for the Apache license, stick it in a shell variable:
export APACHE="$(curl -s http://www.apache.org/licenses/LICENSE-2.0.txt)"


# For a single file:
perl -p -i -e 'BEGIN{undef $/} 
  s#GNU GENERAL PUBLIC LICENSE.*<http://www.gnu.org/philosophy/why-not-lgpl.html>.# Copyright... [$ARGV] <br/> ... $ENV{APACHE}#smg' A.java

注意事項:

  1. Perl では、$ARGV(現在処理中の入力ファイルの) ファイル名が含まれます。

findwith を使用しxargsてこれを再帰的に行うことができると思います。

find . -name "*.java" | xargs -l1 perl ....
于 2012-12-17T09:42:38.753 に答える