У меня есть проект C++, где каждый файл имеет в его начале некоторых строк лицензии. Теперь, то, что моя лицензия изменилась, я должен обновить ее в каждом файле. Я не хочу делать это вручную, начиная с его большой работы. Там какой-либо путь состоит в том, чтобы сделать это более автоматическим? Я попробовал http://regexxer.sourceforge.net/, но ее единственное полезное при контакте с краткими текстами (это не заменяло мою лицензию)...
Моя лицензия:
/****************************************************************************
**
** Copyright (c) 2014, mirx
** All rights reserved.
**
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of XYZ and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
**
****************************************************************************/
Я просто хотел бы добавить некоторые строки к этому коду (замена новой версией) =, но как?
Если текст лицензии всегда появляется в точно том же месте в каждом файле, то Вы могли просто использовать sed
для добавления нового текста после данного номера строки, например,
sed '34a \
** YOUR ADDITIONAL LICENCE TERMS\
** ADDED HERE
' file1.c
Вы могли объединить это с find
для применения его к каждому .c
файл, например
find -name '*.c' -exec sed -i '34a \
** YOUR ADDITIONAL LICENCE TERMS\
** ADDED HERE
' {} \;
Другое решение с помощью awk.
Создайте новый сценарий changeLicense.awk
как это:
{
if (match($1,"^/\*.")!=0) {
i = 0; flag = "false";
comment[i++] = $0;
while(getline > 0) {
if (match($0,"Copyright") != 0) flag = "true";
comment[i++] = $0;
if (match($0,"\*/$")!=0) {
if (flag == "false") {
for (J=0; J<i; J++) print comment[J];
}
else {
while ((getline line < newLicense) > 0)
print line;
close(newLicense);
}
next;
}
}
}
print;
}
Этот сценарий ищет блок строк внутри /*
и */
и если прокомментированный блок строк содержит строку "Авторского права", затем заменяют блок newLicense содержанием файла, иначе сохраняют комментарий.
Для изменения лицензии во всем файле проекта:
find /path/project -name "*.cpp" -exec bash -c 'awk -f /path/changeLicense.awk -v newLicense=/path/fileWithNewContent $1 > $1.new; mv $1.new $1' _ {} \;
Этот сценарий выполнения changeLicense.awk
на каждом .cpp
файл, найденный в /path/project
, вставьте результат .new
файл и, чем исходная замена .cpp
Протестированный на lubuntu 12.04