Как вставить текст в начало файла?
до сих пор я смог найти, Как добавить строку в начало файла, но это не совсем то, чего я хочу. Я покажу это на примере
контент
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
обратите внимание, что на OS X,sed -i <pattern> file
, терпит неудачу. Впрочем, если вы предоставляете расширение резервного копирования, sed -i old <pattern> file
, потом file
изменяется на месте в то время как - это. Затем вы можете удалить file.old
в свой сценарий.
: тег в файл, в верхней части файла с именем родительского каталога.
И. Е., для
/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
обертывает его еще раз, чтобы вставленная строка находилась в начале, а исходный файл-в исходном порядке.
просто для удовольствия, вот решение с помощью ed
который не имеет проблемы не работать с пустым файлом. Вы можете поместить его в скрипт, как и любой другой ответ на этот вопрос.
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
данный скрипт добавляет текст, чтобы вставить в первую строку, а затем присоединяется к первой и второй линии. Чтобы избежать выхода ed при ошибке с недопустимым соединением, он сначала создает пустую строку в конце файла и удаляет ее позже, если она все еще существует.
ограничения: этот скрипт не работает, если <added text>
точно равно одному периоду.