Je veux insérer du texte en haut d'un fichier déjà existant. Comment puis-je atteindre cet objectif. J'ai essayé echo
et tee
mais sans succès.
J'essayais d'insérer une ligne de prise en pension en haut du fichier sources.list
à partir du terminal.
J'ai besoin d'une solution rapide en une ligne, car je connaissais déjà la méthode d'une autre réponse
C'est en fait assez facile avec sed
:
sed -i -e '1iHere is my new top line\' filename
1i
indique à 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.
En général, éditer avec un script est délicat, mais vous pouvez utiliser echo
et cat
, puis 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
Cependant si vous jouez avec sources.list, vous devez ajouter une validation et une mise à l’épreuve des balles pour détecter les erreurs, etc. parce que vous ne voulez vraiment pas perdre cela. Mais c'est une question distincte :-)
./prepend.sh "myString" ./myfile.txt
on sait que prepend
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 absolu, cela devrait fonctionner correctement:
./prepend.sh "my New Line at Top" ../Documents/myfile.txt
si vous voulez un script permanent pour cela, ouvrez nano /etc/bash.bashrc
puis 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 de:
prepend "another line at top" /path/to/my/file.txt
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 voulez que les commandes soient plus lisibles:
ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
1
: aller à la première lignei
: mode d'insertion.
: arrête d'insérer, retourne en mode normalwq
: écrivez et quittez, merci, au revoir.Il y a toujours l'option awk
. Remplacez la variable string
par votre contenu. Ce n'est cependant pas un changement en place. Personnellement, j'ai tendance à ne pas faire de changements sur place. C'est définitivement une préférence personnelle. Deux éléments, -v
signifie une variable dans awk et la variable n
est utilisée ici pour faire correspondre un numéro de ligne, effectivement NR == 1
. Vous pouvez l'utiliser de différentes façons en modifiant simplement la valeur n
et 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
Vous pouvez utiliser Vim en mode Ex:
ex -sc '1i|hello world' -cx sources.list
1
sélectionnez 1ère ligne
i
insère une nouvelle ligne de texte
x
save and close