web-dev-qa-db-fra.com

Ajouter du texte au fichier à une certaine ligne sous Linux

Je veux ajouter une ligne spécifique, disons avatar aux fichiers commençant par MakeFile et avatar doit être ajouté à la 15e ligne du fichier.

Voici comment ajouter du texte aux fichiers:

echo 'avatar' >> MakeFile.websvc

et voici comment ajouter du texte aux fichiers commençant par MakeFile je pense:

echo 'avatar' >> *MakeFile.

Mais je n'arrive pas à ajouter cette ligne à la 15e ligne du fichier.

38
user2123459

Vous pouvez utiliser sed pour résoudre ce problème:

sed "15i avatar" Makefile.txt

ou utilisez le -i option pour enregistrer les modifications apportées au fichier.

sed -i "15i avatar" Makefile.txt

Pour modifier tous les fichiers commençant par Makefile:

sed "15i avatar" Makefile*

Remarque: Dans ce qui précède 15 est votre ligne d'intérêt pour placer le texte.

66

Utilisation de sed:

sed -i '15i\avatar\' Makefile*

où l'option -i indique que la transformation se produit sur place (ce qui est utile par exemple lorsque vous souhaitez traiter plusieurs fichiers).

De plus, dans votre question, * MakeFile signifie 'tous les fichiers qui se terminent par MakeFile', tandis que 'tous les fichiers qui commencent par MakeFile' seraient désignés par MakeFile *.

3
lmsteffan

Si vous devez passer la chaîne et les options de numéro de ligne au script, essayez ceci:

Perl -i -slpe 'print $s if $. == $n; $. = 0 if eof' -- -n=15 -s="avatar" Makefile*

-i éditez le fichier d'entrée, ne faites pas de copie de sauvegarde
$. est le numéro de ligne

Ceci est basé sur ma solution à Insérer une ligne à un numéro de ligne spécifique avec sed ou awk , qui contient plusieurs autres méthodes de passage d'options à Perl, ainsi que des explications sur les options de ligne de commande.

2
Chris Koknat

Si vous voulez une version plus portable, vous pouvez utiliser ex, qui fonctionnera sur n'importe quel * système Nix. (C'est spécifié par POSIX. ) Les commandes Sed données jusqu'à présent dépendent de GNU Sed.

Pour insérer une ligne ne contenant que "avatar" à la 15e ligne de chaque fichier du répertoire courant dont le nom commence par "Makefile", utilisez:

for f in MakeFile.*; do printf '%s\n' 15i 'avatar' . x | ex "$f"; done
2
Wildcard
Perl -pi -e 'if($.==14){s/\n/\navatar\n/g}if(eof){$.=0}' MakeFile*
0
Vijay