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?
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
).
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
Vous pouvez utiliser Vim en mode Ex:
ex -s -c '1i|Sunday Monday' -c x file
1
sélectionner la première ligne
i
insérer du texte et une nouvelle ligne
x
enregistrer et fermer
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.
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
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.
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
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.
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.
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 lignex
é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 motifMalheureusement, 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
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
où header_line
est un fichier contenant la première ligne souhaitée,