Як вставити рядок у верхній частині текстового файлу за допомогою командного рядка?


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, щоб отримати права адміністратора. Але чому б ви хотіли щось додати у самій версії джерел.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 перемістився на другий рядок.


1
Спасибі. Тільки для замітки: якщо ви хочете замінити, замість того, щоб вставити використання, sа не i в 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

Однак якщо ви граєте з source.list, вам потрібно додати певну перевірку та захист від кулі, щоб виявити помилки тощо, оскільки ви дійсно не хочете їх втрачати. Але це окреме питання :-)


Я вже можу це зробити. Мені потрібно рішення в одній лінії, як дав izx. проте дякую за вашу відповідь.
Анвар

1
@AnwarShah - ах вибачте! Ви повинні сказати це у своєму запитанні :-)
Шон

Зізнаюся, +1 за вашу відповідь, а також за коментар. (Я не можу дати більше)
Anwar

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: пишіть і киньте, дякую, до побачення.

Як використовувати заміну змінних оболонок (в 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

2

Ви можете використовувати Vim в режимі Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 виберіть 1-й рядок

  2. i вставити новий рядок тексту

  3. x зберегти і закрити


Набагато простіше, ніж інші рішення, що надаються до цього часу. Дякую.
Поті Калімуту
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.