Как вставить текст в начале файла?

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

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

some text at the beginning

Результат

<added text> some text at the beginning

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

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

Ответ 1

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,}

Ответ 2

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

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

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

Ответ 3

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

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

sed -i '1s/^/your text\n/' file

Ответ 4

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

printf '%s' "some text at the beginning" | cat - filename

Ответ 5

Вставить только новую строку:

sed '1i\\'

Ответ 6

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

Ответ 7

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

sed -i '1s/^/your text\n/' file

Ответ 8

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

I.e., для

/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), а cat - и файл в 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 ... -типы) для них.

ДОБАВЛЕНИЕ: Re: мой последний комментарий, этот script позволит вам переписывать каталоги с пробелами в путях:

#!/bin/bash

## https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## 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

Ответ 9

Существует очень простой способ:

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt

Ответ 10

echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

Первый tac передает файл назад (последняя строка сначала), поэтому последний текст появляется. Второй tac снова обертывает его, поэтому вставленная строка находится в начале, а исходный файл находится в исходном порядке.

Ответ 11

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

sed -i '1iText to add\'

Ответ 12

Просто для удовольствия, вот решение с использованием ed котором нет проблемы не работать с пустым файлом. Вы можете поместить его в скрипт оболочки, как и любой другой ответ на этот вопрос.

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

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

Ограничения: этот скрипт не работает, если <added text> точно равен одному периоду.

Ответ 13

мои два цента:

sed  -i '1i /path/of/file.sh' filename

Это будет работать, даже если строка содержит косую черту "/"