2009-04-21 6 views
0

Je voudrais remplacer (par exemple) le texte des lignes 5-15 dans un fichier avec le texte des lignes 6-15 d'un autre fichier. Mais je voudrais faire cela sur environ 2000 fichiers, et je préférerais ne pas avoir à le faire manuellement.Changement de ligne dans un fichier

Je pourrais écrire quelque chose en perl, mais je voudrais essayer de le faire avec n'importe quel built-ins possible.

Répondre

3

Je serais probablement utiliser sed

for file in bar baz bam; do 
    newfile=$(mktemp) 
    (sed '5q' $file; sed -n '6,15p' foo; sed '1,15d' $file) > $newfile 
    mv -f $newfile $file 
done 

ou Perl

#!/usr/bin/env perl 

use v5.6; # lexical filehandles need Perl >= 5.6 

# usage: $0 foo bar baz bam 
# replaces lines 4-15 of qw(bar baz bam) with lines 6-15 of foo 

my @ins; 

{ 
    open my $fh, shift; 
    while (<$fh>) { 
     push @ins, $_ if 6 .. 15; 
     last if $. >= 15; 
    } 
} 

$^I = ''; 

while (<>) { 
    print if not 5 .. 15; 
    print @ins if $. == 4; 
} 
continue { 
    close ARGV if eof ARGV; 
} 

mais ed fonctionne aussi.

echo '6,15wq foo-part' | ed foo 
for i in bar baz bam; do 
    echo -e '5,15d\n4r foo-part\nwq' | ed $i 
done 
rm -f foo-part 
4
for files in PATTERN ; do 
    sed -n '1,14p' $files > newfile.$files 
    sed -n '6,15p' ANOTHERFILE >> newfile.$files 
    sed -n '15,$p' $files >> newfile.$files 
done 

Note: il est ressource non effecient, mais je suis en train d'écrire sur un serveur très puissant ;-) Et il y a plusieurs autres façons de le faire.

+0

Sed est la voie à suivre ici! Il a été conçu pour cette tâche. –

+0

Puisque les fichiers sont itérés un après un, je pense qu'il serait plus clair et mieux d'écrire "pour le fichier dans ..." au lieu de "pour les fichiers dans ...". – hlovdal

+0

Vous avez raison d'un point de vue grammatical. Et du point de vue subjectif: je peux aussi nommer mes variables comme cVGHJJKAHFDJHSJFO9878932KHJKHJK. Si je peux le comprendre plus tard. –

Questions connexes