Правильно используйте git bash «найти» и «sed». Есть ли у меня лучшее решение?

Я использую 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 перезаписывал файлы.

Но я чувствую, что усложнил себе задачу больше, чем следовало бы. Итак, мой вопрос: правильный ли я подход выбрал? Есть ли более простое решение?

Одна из причин закрытия вопроса заключается в том, что он основан на мнениях, поэтому YMMV специально спрашивает наше мнение: «Есть ли у меня лучшее решение?».

Ed Morton 21.05.2024 01:16

возможно что-то вроде sed -E '\@/\*{84} /{3}_\|@d'

Diego Torres Milano 21.05.2024 01:34

Если вы можете положиться на то, что начало /***... находится в первой позиции в строке, вы можете использовать привязку RE для сканирования только в начале строки, т. е. @^/\*\*.....@ и аналогично привязке для конца строки (опять же предполагая, что нет обучающие пробелы или табы) @/ //\|_/$@. Якорь ^ и $ ищет в начале и конце строки соответственно. Разве ваш инструмент автоматического создания не имеет возможности перезаписать/удалить существующие? Удачи.

shellter 21.05.2024 02:30

пожалуйста, уточните: когда вы говорите «заголовок», вы имеете в виду, что это набор строк, который появляется в начале файла перед всем остальным? Всегда ли это ровно 5 строк, со 2-й File: $Id: и 4-й LEGAL NOTICE ?

jhnc 21.05.2024 04:33

Чтобы ответить шеллтеру, инструмент автогенерации утерян. Это очень старая кодовая база. К сожалению, заголовок jhnc не всегда находится вверху файла.

Jimbo 21.05.2024 19:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может сработать для вас (GNU sed & find):

find . -iregex ".*/.*\(h\|c\|hpp\|cpp\)$" \
       -exec sed  -Ei '\#^/\*+ ///_\|$#,\#^\*+/ //\|_/$#d' {} +

В команде sed включите расширенные регулярные выражения и измените параметры файла на месте.

Используйте диапазон, чтобы удалить заголовки, однако, чтобы облегчить восприятие (возможно?), используйте альтернативные разделители, например \#...#,\#...#.

Н.Б. Завершите команду exec с помощью +, так как это, вероятно, более эффективно.

Спасибо, но команда «найти» возвращает файлы .inc, а также ожидаемые файлы. Я думаю, может быть, так и должно быть: найти . -iregex ".*\.(h\|c\|hpp\|cpp)$" | меньше

Jimbo 21.05.2024 18:09

Другие вопросы по теме