Перебрать все файлы и вставить заголовки файлов

Перебрать все файлы и вставить заголовки файлов

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

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

Я хочу вставить заголовок файла об авторских правах во все файлы *.sh, например, мой заголовок такой:

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

Я борюсь с многострочным текстом, мне удалось написать скрипт ниже, но он не работает для многострочного текста:

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

решение1

Использовать это:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

Примечания:

  1. Оболочка заменит значение$header непосредственно в команду sed. Это позволяет вводить произвольные команды в скрипт sed. Делатьнетделайте это, если вы не доверяете источнику header.

  2. Заголовок содержит /символы. Либо эти символы должны быть экранированы, либо команда замены должна использовать другой разделитель. В приведенном выше примере |в качестве разделителя использовался .

  3. Лучше всего использовать нижний или смешанный регистр для переменных оболочки. Система использует верхний регистр для своих переменных и, хотя в данном случае это не проблема, вы не хотите случайно перезаписать одну из них.

Пример

Чтобы проиллюстрировать измененную команду sed, рассмотрим этот тестовый файл:

$ cat file
1
2
3

Команда sed выдает:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

Связанный контент