Как вставить текст в начале файла?
До сих пор мне удалось найти, как добавить строку в начале файла, но это не совсем то, что я хочу. Я покажу его на примере
Содержимое файла
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
Это будет работать, даже если строка содержит косую черту "/"