315 votes

Comment insérer un texte au début d'un fichier ?

Jusqu'à présent, j'ai réussi à trouver comment ajouter une ligne au début d'un fichier, mais ce n'est pas exactement ce que je veux. Je vais le montrer avec un exemple :

Contenu du fichier

some text at the beginning

Résultat

<added text> some text at the beginning

C'est similaire mais je ne veux pas créer de nouvelle ligne avec...

Je voudrais faire cela avec sed si possible.

1 votes

Quelque chose ici fonctionne pour vous ? stackoverflow.com/questions/54365/ - vous n'avez pas besoin d'utiliser sed .

479voto

kev Points 41855

sed peut intervenir sur une adresse :

$ sed -i '1s/^/<added text> /' file

Qu'est-ce que cette magie 1s que vous voyez sur chaque réponse ici ? Adressage des lignes ! .

Vous voulez ajouter <added text> sur les 10 premières lignes ?

$ sed -i '1,10s/^/<added text> /' file

Ou vous pouvez utiliser Command Grouping :

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}

117 votes

Pour insérer réellement une nouvelle ligne : sed -i '1s/^/<text ajouté> \n /' fichier

2 votes

Pourquoi utiliser -i ? Sur l'homme il est dit que c'est pour le suffixe. linux.die.net/man/1/sed

2 votes

-i signifie in-place, vous pouvez ajouter un suffixe à -i pour faire une copie plutôt que d'écraser. -i.new créera un nouveau fichier se terminant par .new, mais le simple -i modifiera directement le fichier.

83voto

Ali Reza Ebadat Points 11

Si vous voulez ajouter une ligne au début d'un fichier, vous devez ajouter \n à la fin de la chaîne dans la meilleure solution ci-dessus.

La meilleure solution consiste à ajouter la chaîne de caractères, mais avec la chaîne de caractères, elle n'ajoutera pas de ligne à la fin d'un fichier.

sed -i '1s/^/your text\n/' file

1 votes

Ne fonctionne pas pour les fichiers vides.

0 votes

Sur Mac OS, j'obtenais une erreur avec "undefined label". J'ai découvert que vous devez donner une extension pour un fichier de sauvegarde ; voir mkyong.com/mac/

32voto

paxdiablo Points 341644

Si le fichier ne comporte qu'une seule ligne, vous pouvez utiliser :

sed 's/^/insert this /' oldfile > newfile

S'il s'agit de plus d'une ligne, l'une d'entre elles :

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

J'ai inclus ce dernier pour que vous sachiez comment faire des plages de lignes. Toutes deux "remplacent" le marqueur de ligne de départ sur les lignes concernées par le texte que vous voulez insérer. Vous pouvez également (en supposant que votre sed est assez moderne) à utiliser :

sed -i 'whatever command you choose' filename

pour effectuer des modifications sur place.

0 votes

Ne fonctionne pas pour les fichiers vides.

26voto

Nick Roz Points 1298

Utilisez le sous-shell :

echo "$(echo -n 'hello'; cat filename)" > filename

Malheureusement, la substitution de commande supprimera les nouvelles lignes à la fin du fichier. Pour les conserver, on peut utiliser :

echo -n "hello" | cat - filename > /tmp/filename.tmp
mv /tmp/filename.tmp filename

Il n'est pas nécessaire de procéder à un regroupement ou à une substitution de commande.

1 votes

Cette solution supprime les lignes vides à la fin du fichier

2 votes

Il s'agit de la solution supérieure et plus simple que toutes les autres, qui utilise sed qui ne fonctionnent pas pour les fichiers vides.

0 votes

@dafnahaktana c'est à cause de la substitution de commande.

18voto

Pour insérer juste une nouvelle ligne :

sed '1i\\'

2 votes

Je me demande pourquoi les réponses les plus votées utilisent toutes le s au lieu du i. Y a-t-il des inconvénients à cela ?

4 votes

Parce que quand tout ce que vous avez est un marteau, chaque problème ressemble à un clou.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X