Как вставить текст в начале файла? - PullRequest
180 голосов
/ 02 марта 2012

До сих пор я был в состоянии найти, как добавить строку в начале файла, но это не совсем то, что я хочу.Я покажу это на примере

Содержимое файла

some text at the beginning

Результат

<added text> some text at the beginning

Это похоже, ноЯ не хочу создавать с ним новую строку ...

Я хотел бы сделать это с sed, если это возможно.

Ответы [ 14 ]

271 голосов
/ 02 марта 2012

sed может работать по адресу:

$ sed -i '1s/^/<added text> /' file

Что это за волшебство 1s, которое вы видите здесь при каждом ответе? Строка адресации! .

Хотите добавить <added text> в первые 10 строк?

$ sed -i '1,10s/^/<added text> /' file

Или вы можете использовать Command Grouping:

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
29 голосов
/ 05 февраля 2014

Если вы хотите добавить строку в начале файла, вам нужно добавить \n в конце строки в лучшем решении выше.

Лучшее решение - добавить строку, но со строкой она не добавит строку в конец файла.

sed -i '1s/^/your text\n/' file
26 голосов
/ 02 марта 2012

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

sed 's/^/insert this /' oldfile > newfile

Если это более одной строки.один из:

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

Я включил последний, чтобы вы знали, как делать диапазоны линий.Оба из них «заменяют» маркер начальной строки на соответствующих строках текстом, который вы хотите вставить.Вы также можете (при условии, что ваш sed достаточно современный) использовать:

sed -i 'whatever command you choose' filename

для редактирования на месте.

9 голосов
/ 04 января 2016

Чтобы вставить только новую строку:

sed '1i\\'
9 голосов
/ 19 февраля 2015

Вы можете использовать cat -

printf '%s' "some text at the beginning" | cat - filename
5 голосов
/ 09 июля 2015

Обратите внимание, что в OS X sed -i <pattern> file не удается.Однако, если вы укажете расширение для резервной копии sed -i old <pattern> file, тогда file будет изменено на месте, пока создается file.old.Затем вы можете удалить file.old в вашем скрипте.

3 голосов
/ 30 ноября 2017

Есть очень простой способ:

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
3 голосов
/ 24 марта 2017

ПРОБЛЕМА: пометьте файл в верхней части файла базовым именем родительского каталога.

т.е., для

/mnt/Vancouver/Programming/file1

пометьте верхнюю часть file1 с помощью Programming.

РЕШЕНИЕ 1 - непустые файлы:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1s помещает текст в строку 1 файла.

РЕШЕНИЕ 2 - пустые или непустые файлы:

Команда sed выше не работает с пустыми файлами. Вот решение, основанное на https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

Обратите внимание, что - в команде cat требуется (читает стандартный ввод: см. man cat для получения дополнительной информации). Здесь, я полагаю, необходимо взять выходные данные оператора printf (в STDIN), а затем переписать его и файл в temp ... См. Также пояснение внизу http://www.linfo.org/cat.html.

Я также добавил -f к команде mv, чтобы не запрашивать подтверждения при перезаписи файлов.

Для поиска по каталогу:

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

Обратите внимание, что это будет разбивать пути с пробелами; есть решения, в другом месте (например, глобализация файлов или решения типа find . -type f ...) для них.

ADDENDUM: Re: мой последний комментарий, этот скрипт позволит вам просматривать каталоги с пробелами в путях:

#!/bin/bash

## /2996039/kak-rekursivno-perebrat-katalog-chtoby-udalit-faily-s-opredelennymi-rasshireniyami

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# https://superuser.com/questions/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f
2 голосов
/ 30 марта 2016

Чтобы добавить строку в начало файла:

sed -i '1iText to add\'
2 голосов
/ 27 декабря 2013

Привет с возвратом каретки:

sed -i '1s/^/your text\n/' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...