10

すべてのJavaソースファイルのLGPLライセンスヘッダーをApacheLicense2.0ヘッダーに置き換える必要があります。

/*
 * Copyright (c) 2012 Tyler Treat
 * 
 * This file is part of Project Foo.
 *
 * Project Foo is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Project Foo is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Project Foo.  If not, see <http://www.gnu.org/licenses/>.
 */

になる必要があります

/*
 * Copyright (c) 2012 Tyler Treat
 * 
 * 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
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0
 * 
 * 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.
 */

私は、sedを使用して、この著作権ヘッダーのすべての出現箇所を検索して置換するのが最も簡単な方法だと考えました。私はUnixの初心者なので、コマンドを必要な方法で動作させるのに問題がありました。具体的には、複数行の文字列を処理します。基本的に、との代わりにそれぞれのヘッダーを除いて、以下のようなものfooですbar

find . -name "*.java" -print | xargs sed -i 's/foo/bar/g'

sedは一度に1行で動作することを理解しているので、もっと良い解決策があるのではないでしょうか。

4

3 に答える 3

14
find . -name "*.java" -print0 | xargs -0 \
sed -i -e '/Project Foo is free software/,/along with Project Foo/c\
 * 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\
 *\
 *  http://www.apache.org/licenses/LICENSE-2.0\
 *\
 * 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.'

このcコマンドは、行の範囲を指定されたテキストに変更します。範囲は、「Project Fooisfreesoftware」を含む行から「withProjectFoo」を含む行までで識別されます。GNUを示す-iオプション; したがって、私はあなたがGNUも持っていると仮定し、ファイル名などの空白の問題を回避するために使用しました。sedsedfindxargs-print0-0

このために、sedスクリプトをファイル(sed.script)に入れたいと思うかもしれません。ファイルは次のように使用できます。

find . -name "*.java" -exec sed -i -f sed.script {} +

これはすっきりしていると思いますが、見る人の目には美しさがあります。


質問が1つだけあります。アスタリスクの配置が少しずれていますが、インデントするために使用する必要のある空白文字はありますか?置換文字列にスペースを追加してみましたが、効果がないようです。

Grrr ...それは私が(そしてあなたも)なしでできる一種の苛立ちです。'change'データ行の先頭の空白は。によって削除されているようsedです。sedではなくそうbashです; コマンドラインkshのオプションの代わりにスクリプトファイルを使用しても同じ結果が得られました。-e出力された「変更」データを編集することはできません。

うまくいく1つのトリック—しかし、あなたはそれに熱心ではないかもしれません:

$ cat sed.script
/Project Foo is free software/,/along with Project Foo/c\
 * 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\
 *\
 *  http://www.apache.org/licenses/LICENSE-2.0\
 *\
 * 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.
$ s2p -f sed.script > perl.script
$ find . -name "*.java" -exec perl -f perl.script -i.bak {} +
$

このプログラムは、スクリプトをPerlスクリプトにs2p変換するPerlディストリビューションの標準部分ですが、代替データの先頭のスペースを保持します。sed私はこれに熱心ではありませんが、私が考えることができる唯一の選択肢は、各ファイルを2回通過させることです。置換データは次のようになります。

$ cat sed.script
/Project Foo is free software/,/along with Project Foo/c\
@*@ 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\
@*@\
@*@  http://www.apache.org/licenses/LICENSE-2.0\
@*@\
@*@ 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.
$

メインテキストの置換を行った後、次のようにします。

$ find . -name "*.java" -exec sed -i 's/^@\*@/ */' {} +
$

これにより、開始行が追跡され、そのテキストが' '(空白の星)@*@に置き換えられます。*きちんと整頓されているわけではありませんが、これをそれほど頻繁に行うことはないでしょう、と私は信じています。

于 2013-01-01T02:11:08.783 に答える
6

GNUSedを使用した部分的なライセンスの置き換え

GNU sedを使用して、正規表現の行の一致と読み取り式でこれを解決できます。手順は次のとおりです。

ファイルを使用して置換テキストを保持する

まず、ライセンスの置換部分を保持するファイルを作成します。

cat << EOF > /tmp/license
 * 
 * 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
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0
 * 
 * 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.
 */
EOF

実際のSed呼び出しを実行する

次に、findを実行してファイルリストを収集し、次のsedスクリプトを呼び出して変更を加えます。

find . -name '*.java' |
xargs sed -i'' '/Copyright.*Tyler Treat/,/\*\// {
                    /Copyright/n
                    /\*\//r /tmp/license
                    d
                }'

互換性に関する注意

このソリューションは、他のバージョンのsedで機能する場合と機能しない場合がありますが、ローカルでテストされ、GNUsedバージョン4.2.1で機能することがわかっています。お使いのOSXのエディションに同梱されているバージョンのsedで動作しない場合は、MacPortsなどを介してGNUSedをインストールできます。

于 2013-01-01T02:11:11.497 に答える
2

file1に元のテキストが含まれ、file2に置換著作権コメントが含まれていると仮定します。

awk 'f; /\*\//{system("cat file2");f=1}' file1

上記は、元のファイルの最初のコメント終了行を検索し、それが見つかると、置換ファイルをキャットし、元のファイルの残りの部分の印刷をオンにします。

于 2013-01-01T17:36:05.183 に答える