2

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

$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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .