Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在每个文件中替换许可通知_Linux_Unix_Sed_Awk_Replace - Fatal编程技术网

Linux 在每个文件中替换许可通知

Linux 在每个文件中替换许可通知,linux,unix,sed,awk,replace,Linux,Unix,Sed,Awk,Replace,我想在一个相对较大的项目的每个文件的顶部替换一个多行许可通知(从到)。许可通知由两段组成。另一个要求是目标许可通知中有一个占位符,它取决于当前文件名,因此简单的查找和替换是不够的 我熟悉以下方面: find . -name "*.java" -exec sed -i 's/find/replace/g' {} \; 但是我不知道如何使它在这个用例中工作 更新: 目标Apache 2.0许可证的占位符如下所示: Copyright [yyyy] [name of copyright owner]

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

我熟悉以下方面:

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.
版权[yyy][版权所有人姓名]
[filename.java]

根据Apache许可证2.0版(以下简称“许可证”)获得许可; 除非遵守许可证,否则不得使用此文件。 您可以在

获取许可证副本 http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,软件 根据许可证进行的分发是按“原样”进行分发的, 无任何明示或暗示的保证或条件。 请参阅许可证以了解管理权限和权限的特定语言 许可证下的限制。
我知道clicki buntis并不总是更好,但在这种情况下,我使用“kfilereplace”。它是一个kde工具,专为此类目的而设计。它允许您设置正则表达式并运行模拟过程。这样,您可以先测试设置,然后进行“实时”替换

对于占位符:

  • 进行两次更换,分别更换占位符前后的零件。这样,您只需替换两个静态字符串,而无需替换动态字符串
  • 使用许多正则表达式替换函数提供的占位符替换策略来接管要替换的文本的动态占位符部分
我知道clicki buntis并不总是更好,但在这种情况下,我使用“kfilereplace”。它是一个kde工具,专为此类目的而设计。它允许您设置正则表达式并运行模拟过程。这样,您可以先测试设置,然后进行“实时”替换

对于占位符:

  • 进行两次更换,分别更换占位符前后的零件。这样,您只需替换两个静态字符串,而无需替换动态字符串
  • 使用许多正则表达式替换函数提供的占位符替换策略来接管要替换的文本的动态占位符部分
使用以下
sed
命令删除从
start\u模式
开始并以
end\u模式
结束的行:

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
要在多个文件上运行此操作,请使用
find
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'

使用以下
sed
命令删除从
start\u模式
开始并以
end\u模式
结束的行:

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
要在多个文件上运行此操作,请使用
find
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'
Perl:

Perl:


我希望您不要违反许可条款使用此…;-)我是版权所有者,我可以用我的项目的新版本做任何我想做的事;)@GiovanniAzua更新了我的回复,告诉我如何添加占位符。。。如果占位符已经是旧通知的一部分,请让我知道-我认为我们应该马上完成。我希望您不要违反许可证条款…;-)我是版权所有者,我可以用我的项目的新版本做任何我想做的事;)@GiovanniAzua更新了我的回复,告诉我如何添加占位符。。。如果占位符已经是旧通知的一部分,请告诉我-我认为我们应该马上完成。谢谢您的回答!我使用subversion,因此我可以在不破坏/丢失任何内容的情况下“干运行”它。我当然希望您使用某种代码存储库。关于丢失内容:我学会了总是在任何签入操作之前检查每个文件的更改:-)kdesvn非常适合这样做。甚至不需要鼠标,全部由键盘驱动。谢谢你的回答!我使用subversion,因此我可以在不破坏/丢失任何内容的情况下“干运行”它。我当然希望您使用某种代码存储库。关于丢失内容:我学会了总是在任何签入操作之前检查每个文件的更改:-)kdesvn非常适合这样做。甚至不需要鼠标,全部由键盘驱动。谢谢你的回答。占位符如何适应这个解决方案?我只是想问你,占位符在哪里?在GPL的某个地方?还是在外面?它们看起来像什么?我猜你可以把它放在搜索文本
s#GNU…(你的占位符模式)#$ENV{APACHE}$1#
-
$1
应该包含你的占位符-我会在得到更好的图片后尽快清理我的答案。占位符是你想在新通知中添加的东西吗,或者这些已经是当前通知的一部分了?谢谢你的回答。占位符如何适应这个解决方案?我只是想问你,占位符在哪里?在GPL的某个地方?还是在外面?它们看起来像什么?我猜你可以把它放在搜索文本
s#GNU…(你的占位符模式)#$ENV{APACHE}$1#
-
$1
应该包含你的占位符-我会在得到更好的图片后尽快清理我的答案。占位符是你想在新通知中添加的东西吗,或者这些已经是当前通知的一部分?