Comment insérer une ligne en haut d'un fichier texte à l'aide de la ligne de commande?

25

Je veux insérer du texte en haut d'un fichier déjà existant. Comment puis-je atteindre cet objectif. J'ai essayé echoet teemais n'a pas réussi.

J'essayais d'insérer une ligne de sources.listdépôt en haut du fichier du terminal.

Remarque

J'ai besoin d'une solution rapide sur une seule ligne, car une autre méthode de réponse était déjà connue de moi

Anwar
la source
1
tee ajoute une ligne au bas du fichier, par exemple echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- vous devez également sudo avant tee pour obtenir les privilèges d'administrateur. Mais pourquoi diable voudriez-vous ajouter quelque chose tout en haut de sources.list?
Savvas Radevic
2
@medigeek: quelque part dans l'historique des questions de l'OP, vous trouverez quelque chose sur l'installation / la mise à jour à partir d'un CD-repo ... Je soupçonne que cela peut être la raison ...
ish
Merci @izx, votre hypothèse est correcte. Je suis assez impressionné. Pouvez-vous également répondre à cette question. Il s'agissait d'installer à partir d'un référentiel local à l'aide de Software-Center et également de définir mon référentiel local pour la plus haute priorité sans le placer en haut. Merci encore.
Anwar
1
@izx, voici le lien pour définir la priorité la plus élevée sur mon référentiel local. Je serai heureux si vous pouvez également vérifier cette question sur le centre logiciel . Merci encore pour votre premier commentaire. était très content.
Anwar
1
@medigeek, vous pouvez voir cette question pour l'explication d'une question aussi rare.
Anwar

Réponses:

38

C'est en fait assez simple avec sed:

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

  • 1iindique à sed d'insérer le texte qui suit à la ligne 1 du fichier; n'oubliez pas la \nouvelle ligne à la fin pour que la ligne 1 existante soit déplacée vers la ligne 2.

ish
la source
1
Merci. Juste pour la note: si vous voulez remplacer, au lieu d'insérer utiliser sau lieu de i dans 1i.
Anwar
3
Malheureusement, cela échoue pour le fichier vide (il n'a pas de première ligne, donc sed n'insère jamais).
Tino
@Tino Pour les fichiers vides, vous pouvez simplement utiliserecho "Text Here" >> Filename
Flotolk
ne fonctionne pas sur MacOS 10
Krishna
7

Dans l' édition générale en place avec un script est difficile, mais vous pouvez utiliser echoet catpuismv

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

Cependant, si vous jouez avec sources.list, vous devez ajouter une validation et une protection contre les balles pour détecter les erreurs, etc., car vous ne voulez vraiment pas perdre cela. Mais c'est une question distincte :-)

Sean
la source
Je peux déjà le faire. J'ai besoin d'une solution en ligne comme l'izx l'a donné. cependant merci pour votre réponse.
Anwar
1
@AnwarShah - ah désolé! Vous auriez dû dire cela dans votre question :-)
Sean
J'avoue, +1 pour votre réponse et aussi pour vos commentaires. (Je ne peux pas en donner plus)
Anwar
6
./prepend.sh "myString" ./myfile.txt

sait que prependc'est mon shell personnalisé :

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

Utilisez également un chemin relatif ou un chemin absolu, cela devrait fonctionner correctement:

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

Mise à jour :

si vous voulez un script permanent pour cela, ouvrez nano /etc/bash.bashrcpuis ajoutez cette fonction à la fin du fichier:

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

}

Rouvrez votre terminal et profitez:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
la source
5

Et pourquoi ne pas utiliser un véritable éditeur de texte pour cela? ed est l'éditeur de texte standard.

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

Ou, si vous souhaitez que les commandes soient plus lisibles:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: aller en première ligne
  • i: mode d'insertion
  • vos trucs que vous voulez insérer ...
  • .: arrêter l'insertion, revenir en mode normal
  • wq: écrire et quitter, merci, au revoir.
gniourf_gniourf
la source
Comment utiliser la substitution de variables shell (dans le FIRST LINE) avec ça?
vp_arth
1
@vp_arth Si votre contenu est dans la variable first_linealors: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Assurez-vous que la variable ne se développe pas en un seul point et ne contient aucun caractère de nouvelle ligne (alors désinfectez-la si elle provient d'une entrée utilisateur).
gniourf_gniourf
3

Il y a toujours l' awkoption. Remplacez la stringvariable par votre contenu. Ce n'est cependant pas un changement sur place. Personnellement, j'ai tendance à ne pas apporter de changements sur place. C'est définitivement une préférence personnelle. Deux choses, -vsignifie une variable dans awk et variable nest utilisée ici pour faire correspondre un numéro de ligne, efficacement NR == 1. Vous pouvez utiliser cela de différentes manières en changeant simplement la valeur de net s.

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

Exemple:

% 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
la source
2

Vous pouvez utiliser Vim en mode Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 sélectionnez la 1ère ligne

  2. i insérer une nouvelle ligne de texte

  3. x sauver et fermer

Steven Penny
la source
Beaucoup plus simple que les autres solutions proposées jusqu'à présent. Merci.
Pothi Kalimuthu du