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

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

контент

some text at the beginning

результат

<added text> some text at the beginning

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

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

12 ответов


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

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

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

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


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

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

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

можно использовать cat -

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

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

sed '1i\'

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


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

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

: тег в файл, в верхней части файла с именем родительского каталога.

И. Е., для

/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

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

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

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

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

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


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

sed -i '1iText to add\'

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

ed Test <<EOF
a

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

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

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


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

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