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

Обновлено: 02.07.2024

Иногда нам нужно работать с файлом для целей программирования, и новую строку требуется добавить в конец файла. Эту задачу добавления можно выполнить с помощью команд «echo» и «tee». Использование «>>» с командой «echo» добавляет строку в файл. Другой способ — использовать команды «echo», «pipe(|)» и «tee» для добавления содержимого в файл. Как эти команды можно использовать в сценарии bash, показано в этой статье.

Создайте текстовый файл с именем books.txt со следующим содержимым, чтобы выполнить примеры, показанные в следующей части этой статьи.

книги.txt:

Пример 1: добавить строку в файл с помощью команды «echo» и символа «>>»

В следующем скрипте существующий файл books.txt назначается переменной, имени файла и строковому значению, которое пользователь вводит в качестве входных данных для добавления в конец файла. Если входное значение не пустое, команда «echo» добавит значение в файл books.txt, используя символ «>>».

Вывод:

«Learning JQuery» воспринимается как новое текстовое значение в выходных данных, которое добавляется в конец файла.


Пример 2. Добавление строки в файл с помощью команды «printf» и символа «>>»

Символ «>>» можно использовать с командой «printf» для добавления форматированного содержимого в файл. Как и в предыдущем примере, имя файла и строковые значения присваиваются переменным, имени файла и новому тексту. Затем команда «printf» перенаправит значение newtext с другим текстом в конец файла books.txt.

Вывод:

«Веб-сайт от WordPress» воспринимается как новое текстовое значение в выходных данных, которое добавляется в конце файла.


Пример 3: добавить строку в файл с помощью команды `tee`

tee — еще одна полезная команда для добавления любой строки в файл. В следующем скрипте имя файла и новые текстовые значения назначаются так же, как и в предыдущих примерах. Если текстовое значение не пусто, то команда «echo» отправит значение команде «tee» с помощью символа «|». Параметр «-a» используется здесь с командой «tee», чтобы добавить полученное входное значение в файл books.txt. ‘/dev/null’ используется в скрипте для предотвращения отображения вывода в терминале.

Вывод:

«Изучение CSS3» воспринимается как новое текстовое значение в выводе, которое добавляется в конец файла.


Вывод:

В этой статье показаны три различных способа добавления текста в конец файла с помощью сценария bash.

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

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

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

Результат

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

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

18 ответов 18

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

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

-i означает «на месте», вы можете добавить суффикс к -i, чтобы сделать копию, а не перезаписать. -i.new создаст новый файл, оканчивающийся на .new, но просто -i отредактирует файл напрямую.

Обратите внимание, что sed не будет работать с пустым файлом — afaict sed вообще нельзя заставить что-либо делать с вводом нулевой длины.

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

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



В версии sed для Mac OS вы должны указать имя файла резервной копии с параметром -i. Можно передать только пустую строку без резервного копирования, например sed -i '' '1s/^/new test\n/' имя файла

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

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

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

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


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

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

Это лучшее и более простое решение по сравнению со всеми другими, использующими sed , которые не работают с пустыми файлами.

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

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

Это выведет только текст, за которым следует содержимое файла, но не изменит файл вообще.

Это хорошее решение, интересно, почему оно не получило положительных голосов. Вот мой мой добрый сэр. Кроме того, почему printf, а не простое эхо?

Я попытался направить это в файл, добавив > файл к команде, он просто спамил мой терминал "каким-то текстом в начале"

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

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

Обратите внимание, что в OS X sed -i

файл не работает. Однако, если вы укажете расширение для резервного копирования, sed -i old

file , то файл изменяется на месте, пока создается file.old. Затем вы можете удалить file.old в своем скрипте.

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


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

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

пометить верхнюю часть файла1 тегом "Программирование" .

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

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

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

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

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

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


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

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

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

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


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


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

Итак, это будет так:

Самое простое решение, которое я нашел:

  • Удалить | te myFile.txt, если вы не хотите изменять содержимое файла.
  • Удалите параметр -n, если хотите добавить целую строку.
  • Добавьте &> /dev/null в конец, если вы не хотите видеть вывод (сгенерированный файл).
  • Это можно использовать для добавления шебанга к файлу. Пример:

@DavidHeisnam, да, он заменяет файл, если вы не удалите тройник (я обновил ответ). Но он не будет добавлять текст дважды. Возможно, вы выполнили команду дважды. Он работает в bash и zsh.

Рассмотрите возможность использования ex . Поскольку вам нужна передняя часть данной строки, то синтаксис в основном такой же, как и для sed, но встроена опция «редактирование на месте».

Я не могу представить себе среду, в которой у вас есть sed, но не ex / vi , если только это не коробка MS Windows с каким-то специальным "sed.exe", может быть.

sed и grep произошли от ex/vi , поэтому лучше сказать, что синтаксис sed такой же, как у ex .

Длинная версия, я рекомендую бывшего (или редактора, если вы один из крутых ребят).

Мне нравится ex, потому что он портативный, чрезвычайно мощный, позволяет мне писать на месте и/или делать резервные копии без необходимости использования расширений GNU (или даже BSD).

Кроме того, если вы знаете способ ex, то вы знаете, как это сделать в vi и, возможно, в vim, если вам это нравится.

Кроме того, некоторые старые реализации sed, похоже, не имеют расширений (например, \U& ), которые ex должен иметь по умолчанию.

Я искал команду sed для добавления текста в файл в определенной строке. Это работает, добавляя текст после строки 1:

Но я хочу добавить его перед строкой 1. Это будет:

но я получаю эту ошибку: неправильное использование адреса строки 0 .



15 ответов 15

Используйте параметр вставки ( i ) команды sed, который вставит текст в предыдущую строку.

Обновление автора вопроса:

Чтобы заставить его редактировать файл на месте - с помощью GNU sed - мне пришлось добавить параметр -i:

Для не-GNU sed

Вам нужно нажать клавишу возврата сразу после обратной косой черты 1i\ и после first_line_text :

Также обратите внимание, что в некоторых реализациях sed, отличных от GNU (например, в macOS), требуется аргумент для флага -i (используйте -i '', чтобы получить тот же эффект, что и с GNU sed ).

Для реализаций sed, которые вообще не поддерживают -i, запустите без этой опции, но перенаправьте вывод в новый файл. Затем замените старый файл вновь созданным файлом.



Интересно! Я использую Lubuntu 13.10, и у меня работает sed '1 i\этот текст вводится над существующей первой строкой'.

Эхо используется для получения текста. Cat имя_файла — печатает файл в консоли и > использует его для отправки в другой файл имя_файла1, а затем мы перемещаем имя_файла1 в имя_файла, чтобы вставить текст в первую строку нужного файла.


Возможно, потому что в OP упоминается sed. На мой взгляд, это не заслуживает отрицательного голоса. Это решение лучше всего соответствовало моим потребностям, и за него проголосовали.

Вы можете использовать инструмент POSIX, например:

Использование GNU awk >= 4.1:

В отличие от всех ответов sed, это работает и с пустыми файлами.

inplace — это библиотека, и, к сожалению, она присутствует во всех поставляемых дистрибутивах awk. Я получаю "awk: фатальный: не удается открыть исходный файл "на месте" для чтения" GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)

Вы хотите вставить текст перед первой строкой, а не добавлять его после, поэтому используйте

Здесь также может помочь документ:


Если вы не укажете параметр -i, он не покажет никаких ошибок и отобразит вывод на стандартном терминале, но не вставит текст в файл.


Как вы это понимаете? Это является ответом на вопрос. Да, это похоже на принятый ответ, но не совсем то же самое.

@G-Man - можно возразить, что шаблон, используемый cas, далек от идеала, но на самом деле он похож как почти идентичен. разница заключается в интервале и в том, что у этого нет обратной косой черты. Насколько я понимаю, они технически идентичны (поскольку они оба специфичны для gnu sed, и просто так получилось, что gnu sed примет i без обратной косой черты). Если другие считают, что это требует отдельного ответа + голосование. да ладно.

Использованная вами команда 0a действительно работает в ex , предшественнике vi :

Команда printf сама по себе выводит:

0a означает добавление после нулевой строки (т. е. перед первой строкой).

Следующая строка или несколько строк — это буквальный текст, который необходимо добавить.

. на отдельной строке завершает команду "добавить".

Значок x заставляет Ex сохранить изменения в файле и выйти.


Я удивлен, что в этом старом вопросе никто не показал самую распространенную (и довольно простую в данном случае) команду sed:

Что работает в большинстве оболочек и переносится на несколько версий sed при условии, что файл содержит хотя бы одну допустимую строку.
Если доступен GNU sed, вы можете использовать это:

Разница в том, что GNU sed позволяет использовать \n для новой строки, а другим требуется буквальный перевод строки, которому предшествует обратная косая черта (что в любом случае также работает в GNU sed).


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

Контентидос

Как добавить строку в файл в Linux?

Например, вы можете использовать команду echo для добавления текста в конец файла, как показано ниже. В качестве альтернативы вы можете использовать команду printf (не забудьте использовать символ n для добавления следующей строки). Вы также можете использовать команду cat, чтобы объединить текст из одного или нескольких файлов и добавить его в другой файл.

Как перейти к первой строке файла в Linux?

Чтобы сохранить строку, используйте синтаксис var=$(command). В этом случае line=$(awk ‘NR==1’ файл) . С эквивалентной строкой=$(sed -n ‘1p’ файл) .

Как отобразить определенную строку в файле в Unix?

  1. Отображение определенных строк с помощью команд head и tail. Напечатайте одну конкретную строку. Печатать определенный диапазон строк.
  2. Используйте SED для отображения определенных строк.
  3. Используйте AWK для печати определенных строк из файла.

Как вы читаете файл в Linux?

  1. Откройте файл с помощью команды cat.
  2. Откройте файл с помощью команды less.
  3. Откройте файл с помощью команды more.
  4. Откройте файл с помощью команды nl.
  5. Откройте файл с помощью команды gnome-open.
  6. Откройте файл с помощью команды head.
  7. Откройте файл с помощью команды tail.

Как написать содержимое файла в Linux?

Чтобы создать новый файл, используйте команду cat, за которой следует оператор перенаправления ( > ) и имя файла, который вы хотите создать. Нажмите Enter , введите текст и, когда закончите, нажмите CRTL+D, чтобы сохранить файл. Если файл с именем file1. txt, он будет перезаписан.

Как показать первые 100 строк в Unix?

Чтобы просмотреть первые несколько строк файла, введите имя файла head, где имя файла – это имя файла, который вы хотите просмотреть, а затем нажмите . По умолчанию head показывает первые 10 строк файла. Вы можете изменить это, набрав head -number имя файла, где число — это количество строк, которые вы хотите увидеть.

Как прочитать первую строку файла?

Открыть файл в режиме чтения с синтаксисом open(имя файла, режим) как файл: с режимом как «r» . Файл вызова. readline(), чтобы получить первую строку файла и сохранить ее в переменной first_line.

Как выполнить поиск файла в Linux?

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

Как показать первые 10 строк файла в Linux?

  1. напор -10 бар.txt.
  2. напор -20 бар.txt.
  3. sed -n 1,10p /etc/group.
  4. sed -n 1,20p /etc/group.
  5. awk ‘FNR Как показать диапазон строки в Unix?

РЕДАКТИРОВАТЬ: - Просто чтобы добавить объяснение, вы используете head -n 16482 для отображения первых 16482 строк, а затем используйте tail -n 258, чтобы получить последние 258 строк из первого вывода. например $ означает «последняя строка», поэтому первая команда заставляет sed печатать все строки, начиная со строки 16224, а вторая команда заставляет sed выйти после вывода строки 16428.

Как напечатать диапазон строк в Unix?

Команда Linux Sed позволяет печатать только определенные строки на основе номера строки или соответствия шаблону. «p» — это команда для печати данных из буфера шаблонов. Чтобы запретить автоматическую печать пространства шаблонов, используйте команду -n с sed.

Как вы читаете файл в Unix?

  1. Синтаксис для bash, ksh, zsh и всех других оболочек следующий: чтение файла построчно.
  2. при чтении строки -r; сделать КОМАНДУ; done Псссс: Как создать файл в сценарии оболочки Unix?

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