web-dev-qa-db-fra.com

Comment insérer du texte avant la première ligne d'un fichier?

J'ai cherché autour de la commande sed pour ajouter du texte dans un fichier dans une ligne spécifique. Cela fonctionne en ajoutant du texte après la ligne 1:

sed '1 a\

Mais je veux l'ajouter avant ligne 1. Ce serait:

sed '0 a\

mais je reçois cette erreur: invalid usage of line address 0.

Toute suggestion?

83
Manolo

Utilisez l'option d'insertion de sed (i) qui insérera le texte dans la ligne précédente.

sed '1 i\

Mise à jour de l'auteur de la question:

Pour lui faire éditer le fichier en place - avec GNU sed - j'ai dû ajouter le -i option:

sed -i '1 i\anything' file

Aussi la syntaxe

sed  -i '1i text' filename

Pour sed non GN

Vous devez appuyer sur la touche de retour immédiatement après la barre oblique inverse 1i\ et après first_line_text:

sed -i '1i\
first_line_text
'

Notez également que certaines implémentations non GNU sed (par exemple celle sur macOS) nécessitent un argument pour le -i drapeau (utilisez -i '' pour obtenir le même effet qu'avec GNU sed).

117
suspectus

L'écho est utilisé pour obtenir le texte. Cat filename - imprime le fichier dans la console et> l'utilise pour envoyer dans un autre fichier filename1, puis nous déplaçons filename1 vers filename pour insérer le texte dans la première ligne du fichier souhaité.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
19
Ankit Shah

Vous pouvez utiliser Vim en mode Ex:

ex -s -c '1i|Sunday Monday' -c x file
  1. 1 sélectionner la première ligne

  2. i insérer du texte et une nouvelle ligne

  3. x enregistrer et fermer

18
Steven Penny

En utilisant GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Contrairement à toutes les réponses sed, cela fonctionne aussi sur les fichiers vides.

8
rudimeier

Vous voulez insérer du texte avant la première ligne plutôt que ajouter après, utilisez donc

sed '1 i\
your_text' your_file

Un document ici peut également aider:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
7
Joseph R.
sed  -i '1i new_text' file_name

Si vous ne spécifiez pas le -i option, il ne montrera aucune erreur, et affiche la sortie sur le terminal standard, mais n'insère pas le texte dans le fichier.

6
devi.

Je suis surpris que dans cette vieille question, personne n'ait montré la commande sed la plus courante (et assez simple dans ce cas):

$ sed  -i '1s/^/new_text\
/' file_name

Qui fonctionne dans la plupart des shells et est portable sur plusieurs versions sed, à condition que le fichier contienne au moins une ligne valide.
Si GNU sed est disponible, vous pouvez utiliser ceci:

$ sed -i '1s/^/new_text\n' file_name

La différence est que GNU sed permet l'utilisation d'un \n pour une nouvelle ligne et d'autres ont besoin d'une nouvelle ligne littérale précédée d'une barre oblique inverse (qui fonctionne également dans GNU sed de toute façon).

Si un Shell qui accepte le $'…' la syntaxe est utilisée, vous pouvez insérer directement la nouvelle ligne, donc sed voit que la nouvelle ligne est déjà là:

$ sed -i $'1s/^/new_text\\\n/' file_name

Ce qui fonctionne pour les versions plus sed.

Si le fichier n'a pas de lignes (c'est-à-dire: son vide) juste:

$ echo "new_text" > file_name
2
Isaac

Le 0a la commande que vous avez tentée fonctionne dans ex, le prédécesseur de vi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

La commande printf génère à elle seule:

0a
Anything you want to add
.
x

Le 0a signifie ajouter après la 0ème ligne (c'est-à-dire avant la première ligne).

La ligne suivante ou plusieurs lignes est un texte littéral à ajouter.

Le . sur une ligne termine par elle-même la commande "append".

x oblige Ex à enregistrer les modifications dans le fichier et à quitter.

2
Wildcard

Ajout du texte bonjour avant la première ligne sans retour chariot ni saut de ligne dans le fichier monfichier

sed -i '1s/^/hello /' myfile

Cela ne générera pas non plus la totalité du fichier sur le terminal.

0
FastGTR

J'ai eu des problèmes avec BSD sed (MacOS) et l'insertion de texte à partir d'une variable, alors voici comment je l'ai fait:

headers=a,b,c
sed -i '' -e "1{x;s/^.*/$headers/p;x;} some_file"

Explication

  • 1{...} Cela n'affecte que la première ligne
  • x échange la ligne courante avec l'espace d'attente (actuellement vide)
  • s/../../p remplace (la ligne maintenant vide) par le texte attendu (cela évite le problème de saut de ligne) et le renvoie (donc la première ligne sera imprimée)
  • x permuter à nouveau, en récupérant la première ligne du fichier qui se trouvait dans l'espace d'attente dans l'espace de motif
0
estani

Malheureusement, toutes les réponses ci-dessus (principalement avec sed) n'ont pas fonctionné pour moi car elles ont toutes remplacé la première ligne. Je suis sur un Ubuntu 16.04 LTS machine. Voici ma solution avec GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
0
Splinter479

Si quelqu'un est intéressé, mon problème était d'insérer la même ligne d'en-tête dans plusieurs fichiers. Grâce à la solution proposée, j'ai trouvé ceci:

sed -i 1i\ $(cat header_line) data.csv

header_line est un fichier contenant la première ligne souhaitée,

0
rookie