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

76

J'ai cherché autour de sedcommande 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 la ligne 1. Ce serait:

sed '0 a\

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

Toute suggestion?

Manolo
la source

Réponses:

102

L' option sedinsert ( i) de Use qui insérera le texte à la ligne précédente.

sed '1 i\

Question mise à jour de l'auteur:

Pour lui permettre de modifier le fichier à la place - avec GNU sed- je devais ajouter l’ -ioption suivante:

sed -i '1 i\anything' file

Aussi la syntaxe

sed  -i '1i text' filename

Pour les non-GNU sed

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 sedimplémentations non-GNU (par exemple celle sur macOS) nécessitent un argument pour le -idrapeau (à utiliser -i ''pour obtenir le même effet qu'avec GNU sed).

suspect
la source
1
Cela ne fonctionne pas sans -ioption. Je mettrai à jour votre réponse avant d'accepter.
Manolo
1
Merci. Quel système d'exploitation utilisez-vous? La solution originale a fonctionné sur OpenSuse 9.
suspectus
1
Intéressant! Je suis sur Lubuntu 13.10 et sed '1 i\this text is entered above the existing first line' filetravaille pour moi.
2
Ici, utiliser sed (GNU sed) 4.2.2vient de sed '1 i text to insert' -i filefonctionner comme un charme. Merci
ton
1
@FERD Voir ma mauvaise awkréponse classée ci-dessous. Cela devrait marcher.
Rudimeier
18

Echo est utilisé pour obtenir le texte. Cat nomfichier - imprime le fichier dans la console et> l'utilise pour envoyer vers un autre fichier nomfichier1, puis nous déplaçons nomfichier1 vers nomfichier pour que le texte soit inséré dans la première ligne du fichier souhaité.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
Ankit Shah
la source
7
S'il vous plaît laissez-moi savoir pourquoi ce qui suit est voté
Ankit Shah
1
Peut-être parce que le PO mentionne sed. Cela ne mérite pas un vote négatif à mon avis. Cette solution était même la mieux adaptée à mes besoins, puis votée.
Début
J'ai voté. travaille sur ksh pour moi.
arcee123
17

Vous pouvez utiliser Vim en mode Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 sélectionner la première ligne

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

  3. x sauver et fermer

Steven Penny
la source
7

Vous souhaitez insérer du texte avant la première ligne plutôt que de l' 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
Joseph R.
la source
6

Utiliser GNU awk> = 4.1:

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

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

rudimeier
la source
inplaceest une bibliothèque, et malheureusement elle apparaît sur toutes les distributions awk. Je reçois "awk: fatal: impossible d'ouvrir le fichier source 'en place' pour la lecture"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01
6
sed  -i '1i new_text' file_name

Si vous ne spécifiez pas cette -ioption, aucune erreur ne sera affichée, la sortie sera affichée sur un terminal standard, mais le texte ne sera pas inséré dans le fichier.

devi.
la source
La question ne concerne pas le -icommutateur.
don_crissti
Comment comptez-vous cela? Il est une réponse à la question. Oui, c'est similaire à la réponse acceptée, mais pas exactement la même chose.
G-Man
@ G-Man - on pourrait dire que le modèle utilisé par cas est loin d'être idéal, mais en réalité, il ressemble à un modèle presque identique ... la différence étant l'espacement et le fait que celui-ci ne comporte pas de barre oblique inverse. En ce qui me concerne, ils sont techniquement identiques (car ils sont tous gnu sedles deux spécifiques et il se trouve que cela gnu sedva accepter le isans barre oblique inverse). Si d’autres pensent que cela mérite une réponse séparée + un vote positif ... bon.
Don_crissti
2

La 0acommande que vous avez essayé ne fonctionne dans ex, le prédécesseur devi :

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

La printfcommande elle-même génère:

0a
Anything you want to add
.
x

Les 0amoyennes s'ajoutent après la 0ème ligne (c'est-à-dire avant la première ligne).

La ou les lignes suivantes sont le texte littéral à ajouter.

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

Les xcauses Ex pour enregistrer les modifications dans le fichier et quitter.

Wildcard
la source
1

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

Ce qui fonctionne dans la plupart des coques et est portable pour plusieurs versions sed.
Si GNU sed est disponible, vous pouvez utiliser ceci:

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

La différence est que GNU sed autorise l’utilisation d’un \npour une nouvelle ligne et que d’autres ont besoin d’une nouvelle ligne précédée d’une barre oblique inverse (qui fonctionne également dans GNU sed).

Si un shell acceptant la $'…'syntaxe est en cours d'utilisation, vous pouvez insérer la nouvelle ligne directement. Sed voit que la nouvelle ligne est déjà présente:

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

Ce qui fonctionne pour les versions plus sed.

Isaac
la source
-1

Malheureusement, toutes les réponses ci-dessus (principalement avec sed) n'ont pas fonctionné pour moi puisqu'elles se sont toutes substituées à la première ligne. Je suis sur une Ubuntu 16.04 LTSmachine. Voici ma solution de contournement avec GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
Splinter479
la source
1
Vous ne savez pas exactement de quoi vous parlez… Une seule sedréponse utilise le remplacement, mais ne remplace pas la ligne existante.
don_crissti
-2

Premier et dernier

Je suppose que quiconque a cherché comment insérer / ajouter du texte au début / à la fin d'un fichier doit probablement aussi savoir comment faire l'autre.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Explication

Cette calsortie est dirigée vers gnu sed(appelée gsedsur macOS installé via brew.sh ) avec RegEx ( -E) étendu et 6 "scripts" appliqués ( -e) et les sauts de ligne avec échappée \pour plus de lisibilité. Les scripts 1 et 2 utilisent 1i\"à la ligne 1, insérer". Les scripts 5 et 6 utilisent $a\"à la ligne <dernière>, ajoutez". J'ai aligné verticalement les sorties de texte pour que le code représente ce que l'on attend du résultat. Les scripts 3 et 4 font des substitutions (la dernière ne s’appliquant qu'à "ligne <dernier>"). Le résultat est la conversion de la sortie de la commande en JSON valide.

sortie

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
Bruno Bronosky
la source
Bien que je n’aie pas voté sur votre question, notez que nous avons déjà plusieurs réponses, y compris une réponse acceptée, qui démontrent le résultat souhaité.
Jeff Schaller
@JeffSchaller La communauté Stack Exchange n'est pas un forum. Son objectif ne se limite pas à aider le PO à se débloquer. L’objectif est de doter la base de connaissances mondiale de nombreuses options sur lesquelles les chercheurs peuvent trébucher lorsqu’ils cherchent des réponses. La raison pour laquelle j'ai intitulé ma réponse est d'aider les utilisateurs à reconnaître l'utilité de cette réponse avant même de cliquer sur le résultat de Google.
Bruno Bronosky
Ce que je dis, c'est que votre réponse ne fournit aucune nouvelle option (réponse) aux futurs lecteurs de cette question. Nous avons déjà quatre réponses qui utilisent des variantes de 1ipour insérer du texte avant la première ligne. Quelqu'un avec cette question devra extraire les éléments dont il a besoin de votre réponse afin de résoudre son problème. Les questions sont gratuites, je vous invite donc à poser et à répondre à votre propre question afin de fournir votre réponse spécifique.
Jeff Schaller