Как извлечь комментарий из файла заголовка с помощью python, perl или sed?

У меня есть заголовочный файл:

/* * APP 180-2 ALG-254/258/772 implementation * Last update: 03/01/2006 * Issue date: 08/22/2004 * * Copyright (C) 2006 Somebody's Name here * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the project 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 PROJECT 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 PROJECT 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. */ #ifndef HEADER_H #define HEADER_H /* More comments and C++ code here. */ #endif /* End of file. */ 

И я хочу извлечь содержимое первого комментария стиля стиля C и отбросить «*» в начале каждой строки, чтобы получить файл со следующим содержимым:

  APP 180-2 ALG-254/258/772 implementation Last update: 03/01/2006 Issue date: 08/22/2004 Copyright (C) 2006 Somebody's Name here All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the name of the project 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 PROJECT 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 PROJECT 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. 

Пожалуйста, предложите простой способ сделать это с помощью Python, Perl, sed или каким-либо другим способом в Unix. Предпочтительно, как однострочный.

3 Solutions collect form web for “Как извлечь комментарий из файла заголовка с помощью python, perl или sed?”

Это должно сработать для вас:

 sed -n '/\*\//q; /^\/\*/d; s/^ \* \?//p' <file.h >comment.txt 

Вот объяснение: sed (как вы знаете) – это команда, которая проходит через файл, применяя список правил для каждой строки. Каждое правило состоит из «селектора» и команд, которые применяются к этой строке, только если селектор соответствует.

Первое правило имеет селектор /\*\// . Это селектор регулярных выражений; он соответствует любой строке, содержащей символы */ . Оба из них должны иметь обратную косую черту, поскольку они имеют особые значения в регулярном выражении. (Я предположил, что это будет соответствовать только закрывающей строке комментария в вашем случае и что вся эта строка должна быть удалена.) Команда – это q что означает «выйти». sed просто останавливается. Обычно он распечатывал строку, но я предоставил параметр -n который означает «не печатать, если явно не указано».

Второе правило имеет селектор /^\/\*/ который снова является селектором регулярных выражений, который соответствует символам /* в начале строки. Опять же, я предположил, что эта строка не будет содержать часть комментария. Команда d сообщает sed, чтобы удалить эту строку и продолжить.

В последнем правиле нет селектора, поэтому он применяется ко всем строкам (если только предыдущая команда не позволяла процессу получить окончательное правило). Команда в этом последнем правиле является командой подстановки, s/PATTERN/REPLACEMENT/ , которая находит текст в строке, которая соответствует некоторому шаблону и заменяет его заменяющим текстом. Шаблон здесь есть ^ \* \? , который соответствует пробелу, звездочке и 0 или 1 пробелам, но только в начале строки. И замена ничего. Итак, sed просто удаляет ведущее пространство-звездочку (пробел)? последовательность. p на самом деле является флагом команды подстановки, которая сообщает sed распечатать результат подстановки. Это необходимо из-за опции -n .

Pyparsing включает встроенный шаблон для сопоставления форматов комментариев с разных языков. Использование cStyleComment и scanString для поиска первого комментария в исходном файле делает остальные просто строковыми функциями:

 c_src = open(c_source_file).read() from pyparsing import cStyleComment cmt = cStyleComment.scanString(c_src).next()[0][0] lines = [l[3:] for l in cmt.splitlines()] print '\n'.join(lines) 

scanString – это генератор, который возвращает каждое соответствие перед переходом к следующему экземпляру, поэтому обрабатывается только первый комментарий. С вашим примером кода это возвращает:

 APP 180-2 ALG-254/258/772 implementation Last update: 03/01/2006 Issue date: 08/22/2004 Copyright (C) 2006 Somebody's Name here All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the name of the project 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 PROJECT 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 PROJECT 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 -i -r "s/[\/\ ]{1}\*[\/\ ]?//g" YOURFILENAME 

Это заменяет комментарии в вашем файле, сохраняя содержание. Это изменит файл YOURFILENAME. Если вы не хотите, чтобы удалить -i из строки

  • Регулярное выражение - заменить все пробелы в начале строки на периоды
  • Как использовать регулярное выражение python для замены с помощью захваченной группы?
  • Удаление текста из текстового файла
  • Как случайным образом удалить несколько строк из большого файла?
  • Разбор скобок с помощью sed с использованием регулярного выражения
  • Python - используя подпроцесс для вызова sed?
  • Как обрабатывать огромные текстовые файлы, содержащие символы EOF / Ctrl-Z, используя Python в Windows?
  • Команда sed запускается с использованием os.system () или subprocess.call () оставляет файл csv без разделителя
  • Python - лучший язык программирования в мире.