Я использую git bash в Windows.
У меня есть большой набор (тысячи) файлов c/c++ с автоматически сгенерированными заголовками, которые я хочу заменить. Мой план состоит в том, чтобы сначала удалить заголовки, а затем применить новые.
Эти заголовки соответствуют шаблону:
/************************************************************************************ ///_|
File: $Id: //perforcedepot/path/filename.ext#1 $
LEGAL NOTICE: COPYRIGHT YYYY by COMPANY NAME, All Rights Reserved
*************************************************************************************/ //|_/
Я немного поэкспериментировал и пришел к следующему:
sed '//\*\*\*\*\*\*\*\*\*/,// //\|\_//d' filename.ext
Кажется, достаточно хорошо, но мне интересно, есть ли более элегантный способ найти совпадение?
Кроме того, я проверил это с помощью find следующим образом:
find . -iregex '.*\.\(h\|c\|hpp\|cpp\)$' -exec sed '//\*\*\*\*\*\*\*\*\*/,// //\|\_//d' {} \;
Кажется, он подбирает правильные файлы на основе небольшого тестового образца.
Теперь я планирую добавить «-i», чтобы sed перезаписывал файлы.
Но я чувствую, что усложнил себе задачу больше, чем следовало бы. Итак, мой вопрос: правильный ли я подход выбрал? Есть ли более простое решение?
возможно что-то вроде sed -E '\@/\*{84} /{3}_\|@d'
Если вы можете положиться на то, что начало /***... находится в первой позиции в строке, вы можете использовать привязку RE для сканирования только в начале строки, т. е. @^/\*\*.....@ и аналогично привязке для конца строки (опять же предполагая, что нет обучающие пробелы или табы) @/ //\|_/$@. Якорь ^ и $ ищет в начале и конце строки соответственно. Разве ваш инструмент автоматического создания не имеет возможности перезаписать/удалить существующие? Удачи.
пожалуйста, уточните: когда вы говорите «заголовок», вы имеете в виду, что это набор строк, который появляется в начале файла перед всем остальным? Всегда ли это ровно 5 строк, со 2-й File: $Id: и 4-й LEGAL NOTICE ?
Чтобы ответить шеллтеру, инструмент автогенерации утерян. Это очень старая кодовая база. К сожалению, заголовок jhnc не всегда находится вверху файла.





Это может сработать для вас (GNU sed & find):
find . -iregex ".*/.*\(h\|c\|hpp\|cpp\)$" \
-exec sed -Ei '\#^/\*+ ///_\|$#,\#^\*+/ //\|_/$#d' {} +
В команде sed включите расширенные регулярные выражения и измените параметры файла на месте.
Используйте диапазон, чтобы удалить заголовки, однако, чтобы облегчить восприятие (возможно?), используйте альтернативные разделители, например \#...#,\#...#.
Н.Б. Завершите команду exec с помощью +, так как это, вероятно, более эффективно.
Спасибо, но команда «найти» возвращает файлы .inc, а также ожидаемые файлы. Я думаю, может быть, так и должно быть: найти . -iregex ".*\.(h\|c\|hpp\|cpp)$" | меньше
Одна из причин закрытия вопроса заключается в том, что он основан на мнениях, поэтому YMMV специально спрашивает наше мнение: «Есть ли у меня лучшее решение?».