Как вставить текст в начало файла?
до сих пор я был в состоянии найти, как добавить строку в начале файла, но это не совсем то, что я хочу. Я покажу это на примере
контент
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 -- пустые или непустые файлы:
The
sedкоманда, выше, не работает пустой файл. Вот решение, основанное на https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841printf "${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обертывает его еще раз, так что вставленная строка находится в начале, а исходный файл находится в исходном порядке.
просто для удовольствия, вот решение с помощью
edкоторый не имеет проблемы не работает на пустой файл. Вы можете поместить его в скрипт, как и любой другой ответ на этот вопрос.ed Test <<EOF a . 0i <added text> . 1,+1 j $ g/^$/d wq EOFприведенный выше скрипт добавляет текст для вставки в первую строку, а затем соединяет первую и вторую строки. Чтобы избежать выхода ed при ошибке с недопустимым соединением, он сначала создает пустую строку в конце файла и удаляет ее позже, если она все еще существует.
ограничения: этот скрипт не работает, если
<added text>точно равно одному периоду.
Comments