Я пытаюсь добавить заголовок лицензии ко всем заголовочным файлам и исходным файлам в каталоге проекта, используя цикл for. Это не работает, есть ли другой подход sed
?
text-processing
shell-script
Satyendra
источник
источник
Ответы:
источник
globstar
bash, чтобы это работало.Это более или менее просто расширенный комментарий к ответу Даниэля Серодио . Я начал писать это как комментарий, но он быстро стал слишком большим ...
Для того чтобы bash glob был рекурсивным, требуется
shopt -s globstar
. Вы должны включить Globstar, иначе**
не работает. Опция оболочки globstar была введена в версии 4 bash.Чтобы избежать обработки каталога, такого как
my.cpp/
, используйте тест[[ -f $f ]]
... Когда тест заключен в двойные квадратные скобки, переменные не должны заключаться в двойные кавычки.Вы также можете рассмотреть возможность отсутствия подходящих файлов, используя шаблон
shopt -s nullglob
, который позволяет шаблонам, которые не соответствуют ни одному файлу, раскрываться в пустую строку, а не в себя.Для того, чтобы обрабатывать несколько шаблонов, вы можете приковать шаблоны Глобы:
**/*.cpp **/*.h
, но , возможно , предпочтительно, когда вариант оболочка extglob находится на с помощьюshopt -s extglob
, вы можете использовать такие конструкции , такие , как ,**/*.@(cpp|h)
который позволяет избежать несколько проходов по файловой системе; один раз для каждого шаблона.Если вы хотите,
.files
чтобы вас включили, используйте и.*.cpp
т. Д. Или используйтеshopt -s dotglob
Чтобы безопасно обрабатывать изменения файла, который передается по конвейеру, используйте
sponge
from packagemoreutils
(это избавляет вас от необходимости создавать собственный временный файл)источник
[[
может изящно обработать ноль$f
.unset x; [ -f $x ] && echo exists
отчеты "существуют" ... (исправлено)**/*.@(cpp|h)
с$( find . -name "*.h" -name "*.cpp")
Спасибо @fred, @maxmackie, @enzotib.
Можете ли вы проверить процедуру, которой я следовал.
в противном случае заголовок лицензии будет скопирован несколько раз.
Пожалуйста, предложите мне шаблон для просмотра всех заголовков и источников в каталоге проекта и его подкаталогах.
Я не мог полностью понять, что предложил @fred.
источник
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... но, конечно, помимо всего прочего, сначала тщательно проверь это ... PS. Разумеется, здесь, в Unix & Linux, можно публиковать такие дополнения в своем первоначальном вопросе, а не в качестве ответа ...grep
, добавьте-q
опцию кgrep
. Всегда добавляйте двойные кавычки$f
.Вы можете сделать это с помощью
ex
или,ed
если хотите, (вы не должны делать это так,sed
как вы просили,sed
предназначен для редактирования потоков,-i
это плохая идея по разным причинам):источник
sed -i
плохая идея?sed -i
ломает символические и жесткие ссылки, что приводит к неожиданному поведению. В лучшем случае это не интуитивно понятно, в худшем - активно вредно.Если у вас есть
header_file
желаемое содержимое:источник
источник
Блог Герхарда Гаппмайера - Как рекурсивно заменить заголовки файлов исходных файлов
К сообщению в блоге прикреплен
tar.gz
файл, содержащий необходимые файлы.В нем есть
header.template
файл, в котором вы можете написать собственный комментарий, он может занимать несколько строк.У него есть
remove_header.awk
скрипт, который заменяет существующие заголовки новым заголовком.Чтобы запустить его:
источник