получение заголовков / блоков комментариев

689
AnC

У меня есть несколько файлов журнала, которые выглядят так:

/* header arbitrary number of lines */ blah blah blah blah 

Используя простые команды Bash (желательно sed, а не awk), как мне получить только строки заголовка (в идеале включая маркеры комментариев)?

У меня был RTFM и я попробовал поискать в Google, также нашел несколько подсказок, но их недостаточно, чтобы начать.

Спасибо!

1
Другая связанная ссылка: http://www.cyberciti.biz/faq/sed-howto-remove-lines-paragraphs/ Это противоположно тому, что мне нужно, хотя. AnC 14 лет назад 0

4 ответа на вопрос

2
nik

Если вы подтвердите следующее, сценарий в этом ответе будет работать для вас.

  1. Файлы начинаются с /*символов " "
    • Может быть многострочный блок комментариев C-Syntex, который не является вложенным
    • Блок комментариев заканчивается без дополнительных C-операторов на той же строке
sed -n '/ ^ \ / \ * /, / \ * \ // p' file.c # - - - - -  

Это будет соответствовать всем строкам от начала файла до конца блока комментария.
Вторая строка (с " #" в начале) выделяет искомое совпадение.
Символы « -n» в начале и « p» в конце указывают sed печатать только соответствующую часть.

@AnC, я думаю, что проблема в моем решении тоже. Он не останавливается, как команда `Ричарда 'после первого матча! Таким образом, вы получите все комментарии, начиная с новых строк (требование 1 не ограничено началом файла) в файле. nik 14 лет назад 0
Просто понял, что - так что теперь я объединяю оба ваших решения: cat $ LOGFILE | sed -e '/ \ * \ // q' | sed -n '/ ^ \ / \ * /, / \ * \ // p' К сожалению, я не могу отдать должное вам обоим. AnC 14 лет назад 0
@AnC, вы могли бы сделать: `sed -n '/ ^ \ / * /, / * \ // p' $ LOGFILE | sed -e '/ * \ // q'` и пропустите `cat`. Но я еще не рад этому. nik 14 лет назад 0
1
Richard Hoskins

При этом просматриваются все файлы с расширением .log, и, если первая строка содержит только «/ *», выведите все до строки, содержащей только «* /».

for file in *.log; do head -n1 $file | grep -q '^/*' && sed '/^\*\/$/q' $file;  done 
Это делает работу - спасибо! Одно предостережение: он не будет работать, если над заголовком есть что-либо или если есть несколько блоков комментариев. Тем не менее, я не должен беспокоиться об этом, пока мне это не понадобится. AnC 14 лет назад 1
И если нет заголовка, он напечатает весь файл! Есть много режимов отказа. Возможно, вы можете задать вопрос «Как я могу напечатать комментарии в файле?» (И, пожалуйста, позвольте нам использовать awk.) Richard Hoskins 14 лет назад 0
Вы правы - решение Ника кажется более безопасным в этом отношении, поэтому я пока воспользуюсь им. Еще раз спасибо! AnC 14 лет назад 0
Я обновил свой ответ, чтобы избавиться от большинства его худших проблем. Richard Hoskins 14 лет назад 0
Интересный подход. Теперь я разрываюсь между этим и комбинацией обоих ваших решений (см. Комментарии выше) ... AnC 14 лет назад 0
Оба решения имеют проблемы. Если кто-то из них работает на * ваши конкретные обстоятельства *, нам повезло. Если вам нужно более общее решение, (кашель) Perl (кашель). http://search.cpan.org/~mschilli/File-Comments-0.07/lib/File/Comments.pm Richard Hoskins 14 лет назад 0
Вы правы, для более сложных задач следует использовать «правильный» язык сценариев. Спасибо за эту ссылку! AnC 14 лет назад 0
0
Defiant91
cat *.log | sed -e 's/*\/\*//g' -e 's/\*\///g' >> smt.log 

Это может быть

Боюсь, что удаляет только строку "* /". Я экспериментировал с подобными выражениями, но никуда не попал - думаю, это потому, что sed работает построчно. AnC 14 лет назад 0
0
Greg K

В случае, если вы, как и я, наткнулись на этот вопрос, пытаясь получить комментарии в стиле Doxygen, команда sed:

sed -n '/^\/\*/p; /^ \*/p' < file 

Для более подробного объяснения я написал об этом в блоге .

Похожие вопросы