Bash добавить строку в начало файла

Обновлено: 02.07.2024

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

Содержание файла

Результат

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

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

sed может работать с адресом:

Что это за волшебный 1s , который вы видите здесь в каждом ответе? Адресация строки!.

Хотите добавить <added text> в первые 10 строк?

Или вы можете использовать Command Grouping :

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

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

Это будет работать, даже если строка содержит косую черту "/"

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

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

Чтобы вставить только новую строку:

Вы можете использовать cat -

К сожалению, подстановка команд удалит новые строки в конце файла. Для их сохранения можно использовать:

Не требуется ни группировки, ни подстановки команд.

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

Если это более одной строки. один из:

Я включил последнее, чтобы вы знали, как делать диапазоны строк. Оба они «заменяют» маркер начальной строки на затронутых ими строках текстом, который вы хотите вставить. Вы также можете (при условии, что ваш sed достаточно современный) использовать:

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

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

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

При использовании подхода echo , если вы работаете на macOS / BSD, как я, потеряйте переключатель -n , который предлагают другие. И мне нравится определять переменную для текста.

Так было бы так:

Еще одно решение с алиасами. Добавьте в свой файл init rc / env:

Первый tac направляет файл в обратном направлении (сначала последняя строка), поэтому «текст для вставки» появляется последним. Второй tac снова оборачивает его, так что вставленная строка находится в начале, а исходный файл находится в исходном порядке.

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

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

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

ПРОБЛЕМА: отметьте файл в верхней части файла базовым именем родительского каталога.

Пометьте верхнюю часть file1 знаком Programming .

РЕШЕНИЕ 1 - непустые файлы:

1s помещает текст в строку 1 файла.

РЕШЕНИЕ 2 - пустые или непустые файлы:

Я также добавил -f в команду mv , чтобы не запрашивать подтверждения при перезаписи файлов.

Для рекурсии по каталогу:

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

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

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

sed может работать по адресу:

Что это за волшебство 1s вы видите на каждом ответе здесь? Линия адресации! ,

Хотите добавить <added text> в первые 10 строк?

Или вы можете использовать Command Grouping :

Чтобы фактически вставить новую строку: sed -i '1s / ^ / <добавленный текст> \ n /' файл -i означает на месте, вы можете добавить суффикс -i, чтобы сделать копию, а не перезаписать. -i.new создаст новый файл, заканчивающийся на .new, но просто -i отредактирует файл напрямую. Обратите внимание, что sed не будет работать с пустым файлом - afaict sed не может вообще ничего делать с вводом нулевой длины. Недостатком этого решения является то, что оно не добавляет текст, если файл пуст.

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

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

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

Если это более одной строки. один из:

Я включил последний, чтобы вы знали, как делать диапазоны линий. Оба из них «заменяют» маркер начальной строки на соответствующих строках текстом, который вы хотите вставить. Вы также можете (при условии, что вы sed достаточно современны) использовать:

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

Ты можешь использовать cat -

Это только вывело бы текст, сопровождаемый содержанием файла, но это не изменяет файл вообще. Это хорошее решение, мне интересно, почему оно не получило никаких голосов. Вот мой мой хороший сэр. Кроме того, почему printf, а не простое эхо? @ychaouche - возможно потому что нет переносимого способа запретить echo добавление новой строки? printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename

Чтобы вставить только новую строку:

Интересно, почему в топ-ответах все используют s вместо i. Есть ли минусы к этому?

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

Или файл sed -i ''. Тогда он будет просто редактировать на месте, а не делать резервные копии. Я обнаружил, что macOS sed хочет редактировать точку без создания резервной копии: sed -i. Файл <pattern>

ПРОБЛЕМА: пометьте файл в верхней части файла базовым именем родительского каталога.

пометить верх file1 с Programming .

РЕШЕНИЕ 1 - непустые файлы:

1s помещает текст в строку 1 файла.

РЕШЕНИЕ 2 - пустые или непустые файлы:

Я также добавил -f в mv команду, чтобы не запрашивать подтверждения при перезаписи файлов.

Чтобы выполнить поиск по каталогу:

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

Подскажите пожалуйста простую команду, добавляющую в текстовый файл определенную строку перед строкой с номером N.


Открываешь OpenOffice и правишь что нужно. Ваш К.О.


здесь 5 — номер строки.


> tail -n $2 $1

плюс перед $2 посеял, этак он выведет N строк с конца, а не с N по конец файла.

А в целом - красиво оформлено ;)


N=2; sed -e $N"s/^/Newline\n/" -i file


Подскажите пожалуйста простую команду, добавляющую в текстовый файл определенную строку перед строкой с номером N.

добавит TEST STRING перед 2й строкой.


>Открываешь OpenOffice и правишь что нужно. Ваш К.О.

это не КО, а ламо.

добавит строчку перед 666й строкой. Но sed кошернее.


sed -i 4i\ 'Мама мылараму' test.txt

> sed '2iTEST STRING'
о самое простое, похоже =))

о самое простое, похоже =)) Только файлик не изменился



В условии не написано где лежит текст, и куда его надо загнать.

. добавляющую в текстовый файл..

stormy показал простое и элегантное решение


Чего в нём элегантного? :)


stormy показал простое и элегантное решение

/dev/stdout и /dev/stdin это тоже файлы. причём текстовые. я думал, что вы сами догадаетесь, как читать/писать файлы. и нет в решении stormy ничего элегантного - sed-скрипт вообще рваный, и непонятно, что и к чему относится. Кстати, наши решения с командой i ещё и не переносимы, надо писать так:

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

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

sed может работать по адресу:

что это за волшебные 1s вы смотрите на каждый ответ здесь? линия решения!.

хочу добавить <added text> на первых 10 строках?

или вы можете использовать Command Grouping :

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

если это больше, чем одна строка. один из:

Я включил последнее, чтобы вы знали, как делать диапазоны линий. Оба из них "заменяют" маркер начальной строки в своих затронутых строках текстом, который вы хотите вставить. Вы также можете (при условии, что ваш sed достаточно современно) использование:

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

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

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

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

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

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

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

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

тег в верхней части file1 С Programming .

Решение 1 -- непустые файлы:

1s помещает текст в строку 1 файла.

решение 2 -- пустые или непустые файлы:

я также добавил -f до mv команда, чтобы избежать запроса подтверждений при перезаписи файлов.

для рекурсии по каталогу:

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

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

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

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

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

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

Читайте также: