Как вставить строку вверху текстового файла с помощью командной строки?

25

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

Я пытался вставить строку репо в верхней части sources.listфайла из терминала.

Заметка

Мне нужно быстрое решение в одну строку, потому что метод другого ответа мне уже был известен

Анвар
источник
1
tee добавляет строку внизу файла, например echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- вам также нужно использовать sudo перед tee, чтобы получить права администратора. Но с какой стати вы хотите добавить что-то в самый верх Source.list?
Саввас Радевич
2
@medigeek: где-то в истории вопросов ОП вы найдете кое-что об установке / обновлении с CD-репо ... Я подозреваю, что это может быть причиной ...
Иш
Спасибо @izx, Ваше предположение верно. Я тихо впечатлен. Можете ли вы также ответить на этот вопрос. Это было связано с установкой из локального репо с использованием софт-центра, а также с установкой моего локального репо на самый высокий приоритет, не помещая его сверху. Еще раз спасибо.
Анвар
1
@izx, вот ссылка на установку высшего приоритета для моего локального репозитория. Я буду рад, если вы также можете проверить этот вопрос о программном центре . Еще раз спасибо за ваш первый комментарий. был очень рад.
Анвар
1
@medigeek, вы можете увидеть этот вопрос для объяснения такого необычного вопроса.
Анвар

Ответы:

38

На самом деле это довольно легко с sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1iговорит sed вставить текст, следующий за строкой 1 файла; не забывайте \перевод строки в конце, чтобы существующая строка 1 была перемещена в строку 2.

иш
источник
1
Спасибо. Просто для заметки: если вы хотите заменить, вместо вставки использовать sвместо я в 1i.
Анвар
3
К сожалению, это не работает для пустого файла (у него нет первой строки, поэтому sed никогда не вставляет).
Тино
@Tino Для пустых файлов вы можете просто использоватьecho "Text Here" >> Filename
Flotolk
не работает на MacOS 10
Кришна
7

В общем редактирования в месте со сценарием сложно, но вы можете использовать echoи catзатемmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Однако, если вы играете с sources.list, вам нужно добавить некоторую проверку и пуленепробиваемость для обнаружения ошибок и т.д., потому что вы действительно не хотите терять это. Но это отдельный вопрос :-)

Шон
источник
Я уже могу это сделать. Мне нужно решение в одну строку, как IZX дал. однако спасибо за ваш ответ.
Анвар
1
@AnwarShah - ах, извини! Вы должны были сказать это в своем вопросе :-)
Шон
Я признаю, +1 за ваш ответ, а также за комментарий. (Я не могу дать больше)
Анвар
6
./prepend.sh "myString" ./myfile.txt

известно, что prependэто моя пользовательская оболочка :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Используйте также относительный путь или абсолютный путь, он должен работать нормально:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Обновить :

если вам нужен постоянный скрипт для этого, откройте и nano /etc/bash.bashrcдобавьте эту функцию в конец файла:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Откройте свой терминал и наслаждайтесь:

prepend "another line at top" /path/to/my/file.txt
Абденнур ТУМИ
источник
5

И почему бы не использовать настоящий текстовый редактор для этого? ed - стандартный текстовый редактор.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Или, если вы хотите, чтобы команды были более читабельными:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: перейти на первую линию
  • i: режим вставки
  • ваши вещи, которые вы хотите вставить ...
  • .: прекратить вставку, вернуться в нормальный режим
  • wq: пиши и выходи, спасибо, до свидания.
gniourf_gniourf
источник
Как использовать подстановку переменных оболочки (в FIRST LINE) с этим?
vp_arth
1
@vp_arth Если содержание находится в переменной , first_lineто: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Убедитесь, что переменная не расширяется до одной точки и не содержит символов новой строки (поэтому очистите ее, если она поступает из пользовательского ввода).
gniourf_gniourf
3

Всегда есть awkвариант. Замените stringпеременную вашим содержимым. Это не изменение на месте, хотя. Лично я склонен не вносить изменения на месте. Это определенно личное предпочтение. Две вещи, -vозначающие переменную в awk и переменную n, используемую здесь для эффективного соответствия номеру строки NR == 1. Вы можете использовать это любым количеством способов, просто изменив значение nи s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Пример:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
Slashdot
источник
2

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

ex -sc '1i|hello world' -cx sources.list
  1. 1 выберите 1-ую строку

  2. i вставить новую строку текста

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

Стивен Пенни
источник
Гораздо проще, чем другие решения, представленные до сих пор. Спасибо.
Поти Калимуту