0

我想在一个相对较大的项目的每个文件的顶部替换多行许可通知(从GNU GPLApache 2.0 )。许可通知由几段组成。另一个要求是目标许可证通知中有一个取决于当前文件名的占位符,因此简单的查找和替换是不够的。

我熟悉这样做:

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 工具。它允许您设置正则表达式并运行模拟通行证。这样,您可以首先测试您的设置,然后进行“实时”替换。

对于占位符:

  • 进行两次更换,分别更换占位符之前和之后的部分。这样你只需要替换两个静态字符串,没有动态的。
  • 使用许多正则表达式替换函数提供的占位符替换策略来接管要替换的文本的动态占位符部分。
于 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包含文件名(当前正在处理的输入文件的)

我想您可以使用findwithxargs递归地执行此操作。

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