Вставка текста из файла в начало другого файла - bash - PullRequest
7 голосов
/ 24 сентября 2010

Я пытаюсь вставить некоторую информацию об авторских правах в начало некоторых исходных файлов. Я знаю, что используя sed следующим образом:

sed "1iSome copyrighted information." sample.txt

вставит текст "Некоторая информация об авторских правах" в начало файла sample.txt.
Мне нужно вставить текст из файла в начало файла sample.txt. Есть ли какой-нибудь способ в sed, чтобы я мог использовать команду cat для вышеуказанной цели, скажем что-то вроде следующего?

sed "1i{cat header.txt}" sample.txt

Я гуглил по вышесказанному и не нашел именно то, что искал. Любая помощь по этому вопросу приветствуется.

Спасибо.

Ответы [ 6 ]

9 голосов
/ 04 мая 2011

Извините, что израсходовал весь ответ - только для форматирования :) В основном, тот же ответ от @tangens, но без временного файла:

echo "$(cat header.txt sample.txt)" > sample.txt

Обратите внимание на кавычки (") для сохранения окончаний строк и того факта, что конкатенация cat выполняется в подпроцессе - поэтому не должно быть возможности перезаписать файл (sample.txt), который открыт для чтения ..

Ура!

9 голосов
/ 24 сентября 2010

Если у вас есть GNU sed:

sed -i -e '2{x;G};1{h;rheader.txt' -e 'd}' sample.txt

sample.txt должен содержать как минимум две строки.

Этот метод работает, даже если заголовочный файл содержит специальные символыsed.

Объяснение:

  • -i - отредактировать файл на месте
  • -e - разбить скрипт на части - этов этом случае необходимо разделить конец имени файла заголовка (он также может быть разделен символом новой строки)
  • 1{h; - в первой строке файла (sample.txt) сохранить его для хранения пробела
  • rheader.txt - прочитать в заголовочном файле (header.txt)
  • d} - удалить исходную первую строку файла из пространства шаблонов и завершить обработку строки 1 - удалив ее здесьпредотвращает вставку дополнительной пустой строки в начало файла
  • содержимое файла заголовка теперь выводится
  • 2{x; - при чтении строки 2 файла (sample.txt), переместите его в пространство удержания и измените пространство удержания (содержащее исходную строку 1) вшаблонное пространство
  • G} - добавьте удерживающее пространство в конец пространства шаблонов (которое теперь содержит исходные строки 1 и 2) и завершите обработку строки 2
  • , теперь выводятся строки 1 и 2затем обработка продолжается для остальной части файла, которая состоит из простого чтения и вывода каждой строки.

Редактировать: Я удалил лишнюю команду из версии, которую я первоначально опубликовал.

8 голосов
/ 24 сентября 2010

Используйте текстовый редактор ed:

echo -e '0r header.txt\nw' | ed sample.txt

или используйте команду vi / ex:

vi - +'0r header.txt|wq' sample.txt

Но я не вижу способа запустить команду в sed.

4 голосов
/ 24 сентября 2010
cat header.txt sample.txt > temp.txt
mv temp.txt sample.txt
1 голос
/ 24 сентября 2010

Если вы действительно хотите сделать это, используя sed:

INFO=$(cat header.txt)  # read the contents of file headers.txt into var INFO
sed -i "1i$INFO" sample.txt # insert $INFO, use -i to change the file inplace

Однако я бы использовал метод cat.

0 голосов
/ 24 сентября 2010

Почему бы не сделать это наоборот, например, добавить исходные файлы в ваш файл авторских прав?

Команда 'cat' на самом деле коротка для 'сцепления', вы можете просто сказать

for f in *.c
do
    cp $f /tmp
    cat copyright.txt /tmp/$f >$f
done
...