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

Привет, я хочу добавить текст в файл. Например, я хочу добавить задачи в начало файла todo.txt. Я знаю, что задача echo здесь идет>>>> todo.txt , но это добавляет строку в конец файла (не то, что я хочу).

226 голосов | спросил user479534 17 FebruaryEurope/MoscowbThu, 17 Feb 2011 06:21:12 +0300000000amThu, 17 Feb 2011 06:21:12 +030011 2011, 06:21:12

9 ответов


302
  Задача echo 'here here' | cat-todo.txt> temp & amp; & amp; mv temp todo.txt
 

или

  Команда sed -i '1s /^ /задается здесь \ n /' todo.txt
 

или

  sed -i '1itask идет здесь' todo.txt
 
ответил Dennis Williamson 17 FebruaryEurope/MoscowbThu, 17 Feb 2011 06:34:10 +0300000000amThu, 17 Feb 2011 06:34:10 +030011 2011, 06:34:10
59

Проще говоря, на мой взгляд:

  echo -e "задается здесь \ n $ (cat todo.txt)"> todo.txt
 

Это работает, потому что команда внутри $ (...) выполняется до того, как todo.txt будет перезаписан с помощью > todo.txt

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

EDIT: Это решение очень плохое, если в todo.txt есть обратная косая черта, потому что благодаря флагов -e эхо будет их интерпретировать. Другой, гораздо более простой способ получить символы новой строки в строке предисловия ...

Задача
  echo "
$ (cat todo.txt) "& gt; todo.txt
 

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

  (задача echo идет здесь '& amp; & amp; cat todo.txt)> todo.txt
echo 'задается здесь' $ '\ n' "$ (cat todo.txt)"> todo.txt
 

Кроме того, если вам интересно, добавлена ​​ли новая строка в конец todo.txt , не используйте их. Ну, кроме второго до последнего. Это не путается с концом.

ответил John Alberts 19 WedEurope/Moscow2012-12-19T22:57:40+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 22:57:40 +0400 2012, 22:57:40
26

moreutils имеет приятный инструмент под названием sponge :

  Выполняется эхо-запрос "| cat - todo.txt | sponge todo.txt
 

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

Вы можете получить moreutils со многими дистрибутивами Linux, используя apt-get install moreutils или в OS X, используя Homebrew , с помощью brew install moreutils .

ответил slhck 22 PMpMon, 22 Apr 2013 16:47:19 +040047Monday 2013, 16:47:19
5

Вы можете использовать Vim в режиме Ex:

  ex -sc '1i | задача идет здесь' -cx todo.txt
 
  1. 1 выберите первую строку

  2. i вставить

  3. x сохранить и закрыть

ответил Steven Penny 11 AMpMon, 11 Apr 2016 03:23:56 +030023Monday 2016, 03:23:56
3

Вы можете создать новый временный файл.

  echo "new task"> new_todo.txt
cat todo.txt> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
 

Вы также можете использовать sed или awk . Но в основном происходит то же самое.

ответил Keith 17 FebruaryEurope/MoscowbThu, 17 Feb 2011 06:26:24 +0300000000amThu, 17 Feb 2011 06:26:24 +030011 2011, 06:26:24
3

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

  echo "$ (задача echo идет здесь 'cat-todo.txt)"> todo.txt
 

Невозможно добавить строки в начало файла без написания всего файла.

ответил Rucent88 10 Jam1000000amThu, 10 Jan 2013 02:49:33 +040013 2013, 02:49:33
2

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

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

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

  cat <(echo task go to there) todo.txt> todo.txt.new & amp; & amp; & amp; mv todo.txt.new todo.txt
 
ответил jlliagre 17 FebruaryEurope/MoscowbThu, 17 Feb 2011 09:25:01 +0300000000amThu, 17 Feb 2011 09:25:01 +030011 2011, 09:25:01
1

Вы можете использовать tee :

  Задача echo 'here here' | cat - todo.txt | tee todo.txt
 
ответил Radu Rădeanu 8 J000000Tuesday14 2014, 18:16:36
0

GitBash + Windows10 + Multline :

Вот версия, которая позволяет использовать многострочные строки .

  ############################################ ##
## Этот раздел только для демонстрационной цели, ##
## Таким образом, вы можете сохранить весь файл как ##
## whatever.sh и запустите его. ##
## ##
##############################################
& GT; MY_TARGET_FILE.txt ## Сделать или очистить файл
эхо "[STARTER_CONTENT]">>>> MY_TARGET_FILE.txt
##############################################

## Ниже приведен основной код:

##################################################
TARGET_FILE_VARIABLE = "MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE = $ (cat <"HEREDOC_HEAD_TEXT"
//| + ------------------------------------- + | //
//| | | | //
//| | MESSAGE_FOR_HEAD_OF_FILE | | //
//| | | | //
//| + ------------------------------------- + | //
HEREDOC_HEAD_TEXT
)
##################################################
TAR = $ TARGET_FILE_VARIABLE ##
TEX = $ ADD_TO_HEAD_VARIABLE ##
echo "$ TEX" | cat - $ TAR> TEMP & amp; & amp; mv TEMP $ TAR ##
##################################################

## Ожидаемое содержимое MY_TARGET_FILE.txt:
## //| + ------------------------------------- + | //
## //| | | | //
## //| | MESSAGE_FOR_HEAD_OF_FILE | | //
## //| | | | //
## //| + ------------------------------------- + | //
## [STARTER_CONTENT]
 
ответил J MADISON 4 AM000000100000004831 2018, 10:04:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132