Предположим, у меня есть такой фиктивный проект:
$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|" {} \;
Примечания:
Оболочка заменит значение
$header
непосредственно в команду sed. Это позволяет вводить произвольные команды в скрипт sed. Делатьнетделайте это, если вы не доверяете источникуheader
.Заголовок содержит
/
символы. Либо эти символы должны быть экранированы, либо команда замены должна использовать другой разделитель. В приведенном выше примере|
в качестве разделителя использовался .Лучше всего использовать нижний или смешанный регистр для переменных оболочки. Система использует верхний регистр для своих переменных и, хотя в данном случае это не проблема, вы не хотите случайно перезаписать одну из них.
Пример
Чтобы проиллюстрировать измененную команду sed, рассмотрим этот тестовый файл:
$ cat file
1
2
3
Команда sed выдает:
$ sed "1s|^|$header|" file
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
1
2
3