Comment puis-je remplacer les lignes au milieu d'un fichier avec Perl?
Je suis de l'ouverture du fichier en mode ajout. J'ai besoin de remplacer les lignes 2, 3 et 4 dans le fichier, et plus tard, j'ai besoin d'ajouter de nouvelles données à la fin du fichier.
- Il ne ressemble pas à ouvrir le fichier en mode ajout est compatible avec substitution, à la ligne 2, 3 et 4 qui ont déjà été écrits.
- Comment je peut transférer des données à partir d'un fichier à l'autre avec les données désirées et d'ajouter de nouvelles données à la fin
- Vous devez ouvrir deux fichiers, l'un que vous lisez et que vous écrivez. Puis la boucle à travers la première, et ajouter des données à partir du second fichier.
- J'ai la même question. Mais sachez que dans mon cas, le fichier doit être modifié en ligne. Ce qui signifie, il n'est pas possible d'ouvrir un nouveau fichier pour écrire que la FAQ de la méthode, ni possible d'exécuter 'perl -pi" dans bash. Ne pense pas que la réponse est utile.
Vous devez vous connecter pour publier un commentaire.
Je pense que c'est la FAQ réponse que j'ai reposté à Stackoverflow le plus. Le perlfaq5 a la réponse à Comment puis-je modifier, supprimer ou insérer une ligne dans un fichier, ou d'ajouter au début du fichier?.
Oublier le mode d'ajout des trucs. Qui va juste vous rendre la vie plus difficile.
L'idée de base de l'insertion, la modification ou la suppression d'une ligne d'un fichier texte implique la lecture et l'impression du fichier à l'endroit que vous voulez faire le changement, le changement, puis de la lecture et de l'impression, le reste du fichier. Perl n'est pas de fournir un accès aléatoire aux lignes (surtout depuis l'entrée d'enregistrement séparateur,
$/
, est sujette au changement), bien que des modules tels que Tie::File peut faux.Un programme en Perl pour faire ces tâches prend la forme de base de l'ouverture d'un fichier, d'impression de ses lignes, puis de la fermeture du fichier:
À l'intérieur de cette forme de base, ajouter les pièces que vous avez besoin d'insérer, de modifier ou de supprimer des lignes.
À ajouter des lignes au début, l'impression de ces lignes avant d'entrer dans la boucle qui imprime les lignes existantes.
De changer les lignes, insérer le code à modifier les lignes à l'intérieur de la boucle while. Dans ce cas, le code est tous mis en minuscule versions de "perl" et majuscules eux. Le phénomène se produit pour chaque ligne, alors assurez-vous que vous êtes censé faire que sur chaque ligne!
Changer seulement une ligne en particulier, l'entrée du numéro de ligne,
$.
, est utile. D'abord de lire et d'imprimer les lignes jusqu'à celui que vous voulez modifier. Ensuite, lisez la seule ligne que vous voulez modifier, de le modifier, et de l'imprimer. Après cela, lire le reste de l'lignes et imprimer ces:À sauter des lignes, utilisez la boucle de contrôle. La prochaine dans cet exemple, ignore les lignes de commentaires, et le dernier s'arrête tous les traitements une fois qu'elle rencontre soit
__END__
ou__DATA__
.Faire le même genre de chose pour supprimer une ligne en cliquant sur suivant pour sauter les lignes que vous ne voulez pas afficher dans la sortie. Cet exemple saute à chaque cinquième ligne:
Si, pour une raison étrange, vous voulez vraiment voir l'ensemble du dossier à la fois plutôt que de les traiter ligne par ligne, vous pouvez slurp dans (aussi longtemps que vous pouvez équiper toute chose dans la mémoire!):
Des Modules tels que Fichier::Slurp et Tie::File peut aider avec cela aussi. Si vous le pouvez, toutefois, éviter de lire l'ensemble du dossier à la fois. Perl ne vous donnera pas de mémoire pour le système d'exploitation jusqu'à ce que le processus se termine.
Vous pouvez également utiliser Perl one-liners de modifier un fichier en place. Les modifications suivantes de toutes les "Fred" à 'Barney' dans inFile.txt, en écrasant le fichier avec le nouveau contenu. Avec le
-p
commutateur, Perl enroule une boucle while autour du code que vous spécifiez avec-e
, et-i
s'allume dans l'édition. La ligne actuelle est en$_
. Avec-p
, Perl imprime automatiquement la valeur de$_
à la fin de la boucle. Voir perlrun pour plus de détails.De faire une sauvegarde de inFile.txt, donner
-i
une extension de fichier à ajouter:De changer seulement la cinquième ligne, vous pouvez ajouter un test de vérification de
$.
, l'entrée numéro de la ligne, puis seulement effectuer l'opération lorsque le test passe:Pour ajouter des lignes avant une certaine ligne, vous pouvez ajouter une ligne (ou des lignes!) avant de Perl imprime
$_
:Vous pouvez même ajouter une ligne au début d'un fichier, depuis la ligne courante imprime à la fin de la boucle:
Pour insérer une ligne après un déjà dans le fichier, utilisez le
-n
commutateur. C'est comme-p
sauf qu'il n'a pas l'impression$_
à la fin de la boucle, de sorte que vous avez à faire vous-même. Dans ce cas, l'impression$_
d'abord, puis imprimer la ligne que vous souhaitez ajouter.À supprimer les lignes, d'imprimer uniquement ceux que vous souhaitez.
Vous pouvez faire cela avec Tie::File. (Sachez qu'il faudra réécrire l'intégralité du fichier, afin de remplacer la première lignes, mais Tie::File permet de masquer les détails de vous.)
Un bon langage Perl est à lire et à écrire à la norme d'entrée et de sortie. Vous pouvez pipe et de réorienter si nécessaire. Par le biais de l'opérateur <> (une enveloppe de readline), Perl va ouvrir les fichiers que vous passer en argument sur la ligne de commande.
Pour répondre à votre question, quelques lignes de code (pure) :
Ensuite l'appeler de cette façon : perl yourscript.pl inputfile > outputfile
Si vous souhaitez ouvrir les fichiers vous-même (ici, nous avons simplement ignorer les lignes indésirables) :
Si vous ouvrez un fichier dans mode append alors vous ne pouvez pas remplacer une ligne qui était déjà dans le fichier lorsque vous l'avez ouvert. Ajout de fichier signifie que votre programme a la capacité de lire le fichier et ajouter à la fin de celui-ci.
Vous pouvez créer un nouveau fichier, ajoutez du contenu (peut-être basé sur le contenu d'un autre fichier), puis copiez le nouveau fichier sur le fichier différent.
Je suppose que je n'ai pas très bien compris la cession.
copy
lit & écrit l'intégralité du fichier, et ensuite vous lire et de l'écrire à nouveau. Il serait préférable de sauter le copier, lire à partir de file1.txt, écrire à fichier1.de nouveau, puis renommez le fichier fichier1.nouveau à file1.txt.