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



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



контент



some text at the beginning


результат



<added text> some text at the beginning


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



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

590   12  

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 -- пустые или непустые файлы:

The 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: мой последний комментарий, этот скрипт позволит вы рекурсировать по каталогам с пробелами в пути:

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

Comments

    Ничего не найдено.