Comment insérer du texte après une certaine chaîne dans un fichier?

69

En ce moment, je me sers echo "Hello World" >> file.txtd’ajouter du texte à un fichier, mais j’ai également besoin d’ajouter du texte au-dessous d’une certaine chaîne, disons "[option]", est-ce possible avec sed?

PAR EXEMPLE:

Fichier d'entrée

Some text
Random
[option]
Some stuff

Fichier de sortie

Some text
Random
[option]
*inserted text*
Some stuff
Javier Villanueva
la source
1
Vous devez être plus précis et donner un exemple de texte pour que les gens vous aident avec les commandes exactes.
clement
éditez-vous s'il vous plaît Q et montrez inputles outputlignes. Parce que votre Q n'est pas clair. Vous pouvez également le faire echo "Hello World [option]" >> file.txt, mais cela n’a aucun sens.
J'ai modifié la question pour fournir plus d'informations à titre de référence, mais la réponse acceptée était ce que j'essayais d'accomplir
Javier Villanueva,
Si vous voulez juste éditer un fichier de configuration, c'est la meilleure solution que j'ai trouvée: unix.stackexchange.com/a/78076/20661
rubo77

Réponses:

104

Ajouter ligne après match

  • sed '/\[option\]/a Hello World' input

Insérer une ligne avant le match

  • sed '/\[option\]/i Hello World' input

En outre, vous pouvez effectuer une sauvegarde et modifier le fichier d’entrée sur place à l’aide -i.bkpde

Rahul Patil
la source
2
sur osx je reçoissed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole
pour Mac OSX, j’avais besoin d’ajouter \ <<NEWLINE>>après l’ aoption
Tom Howard
Le code ci-dessus va ajouter / insérer la ligne pour chaque correspondance. Si vous voulez ajouter / insérer la ligne pour la première correspondance uniquement, vous pouvez ajouter 0,des commandes aux commandes: sed '0,/\[option\]/a Hello World' inputoused '0,/\[option\]/i Hello World' input
kimbaudi
33

Oui, c'est possible avec sed:

sed '/pattern/a some text here' filename

Un exemple:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
devnull
la source
2
@javiervd Je ne suis pas sûr de comprendre ce que tu voulais dire par première réponse? Si vous vouliez dire d'abord au moment de répondre, vous vous trompez. Vous n'avez pas observé les horodatages avec soin!
devnull
Est-il possible de l'ajouter après la correspondance de la dernière chaîne? Par exemple: foo bar option bar option baz . Alors le motif devient foo bar option bar option addedstring baz ?
Ari
4

Avec awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Gardez à l'esprit que certains caractères ne peuvent pas être inclus à la lettre; vous devez donc utiliser des séquences d'échappement (elles commencent par une barre oblique inverse), par exemple, pour imprimer une barre oblique inverse littérale, vous devez écrire \\.

C'est en fait la même chose sedmais en plus, chaque nouvelle ligne incorporée dans le texte doit être précédée d'une barre oblique inverse:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Pour plus de détails sur les séquences d'échappement, consultez le manuel.

don_crissti
la source
Une ligne awk ne change pas réellement le texte, seulement la sortie.
Josef Klimuk