Question

J'ai un répertoire plein de fichiers et je dois retirer les en-têtes et les pieds de page. Ils ont tous une longueur variable, donc utiliser la tête ou la queue ne va pas marcher. Je peux rechercher dans chaque fichier une ligne, mais je ne souhaite pas l'inclure dans les résultats.

C'est habituellement

*** Start (more text here)

Et se termine par

*** Finish (more text here)

Je veux que les noms de fichiers restent les mêmes. Je dois donc écraser les originaux ou écrire dans un autre répertoire et je les écraserai moi-même.

Oh oui, c'est sur un serveur Linux bien sûr, alors j'ai Perl, sed, awk, grep, etc.

Était-ce utile?

La solution

Essayez le flip flop! " .. " opérateur.

# flip-flop.pl
use strict;
use warnings;

my $start  = qr/^\*\*\* Start/;
my $finish = qr/^\*\*\* Finish/;

while ( <> ) {
    if ( /$start/ .. /$finish/ ) {
        next  if /$start/ or /$finish/;
        print 

Essayez le flip flop! " .. " opérateur.

 $ perl -i'copy_*' flip-flop.pl data.txt 

Vous pouvez ensuite utiliser le commutateur -i Perl pour mettre à jour votre / vos fichier (s) de la manière suivante .....

<*>

... qui modifie le fichier data.txt mais en fait une copie au préalable sous la forme "copy_data.txt".

; } }

Vous pouvez ensuite utiliser le commutateur -i Perl pour mettre à jour votre / vos fichier (s) de la manière suivante .....

<*>

... qui modifie le fichier data.txt mais en fait une copie au préalable sous la forme "copy_data.txt".

Autres conseils

Les coreutils GNU sont vos amis ...

csplit inputfile %^\*\*\* Start%1 /^\*\*\* Finish/ %% {*}

Le fichier souhaité est ainsi produit sous la forme xx00 . Vous pouvez modifier ce comportement via les options - préfixe , - suffixe et - chiffres , mais reportez-vous à la section manuel pour vous-même. csplit étant conçu pour produire un certain nombre de fichiers, il est impossible de produire un fichier sans suffixe. Vous devrez donc l'écraser manuellement ou par le biais d'un script:

csplit $1 %^\*\*\* Start%1 /^\*\*\* Finish/ %% {*}
mv -f xx00 $1

Ajoutez des boucles à votre guise.

Pour obtenir le en-tête :

cat yourFileHere | awk '{if (d > 0) print 
cat yourFileHere | awk '/.*Finish.*/ {d = 1} {if (d < 1) print 
cat yourFileHere | awk '/.*Start.*/ {d = 1; next} /.*Finish.*/ {d = 0; next} {if (d > 0) print 
csplit yourFileHere /Start/ /Finish/
}'
}'
} /.*Start.*/ {d = 1}'

Pour obtenir le pied de page :

<*>

Pour obtenir le fichier de en-tête au bas de page à votre guise:

<*>

Il existe un moyen supplémentaire, avec la commande csplit, vous devriez essayer quelque chose comme:

<*>

Et examinez les fichiers nommés 'xxNN' où NN exécute un numéro, consultez également page de manuel csplit .

Peut-être? Commencez à terminer avec non-suppression.

$ sed -i '/^\*\*\* Start/,/^\*\*\* Finish/d!' *

ou ... moins sûr ... mais si cela fonctionne, supprimez également les lignes de début et de fin:

$ sed -i -e '/./,/^\*\*\* Start/d' -e '/^\*\*\* Finish/,/./d' *

d! peut dépendre de la construction de sed que vous avez - pas sûr.
Et j’ai écrit cela entièrement sur (probablement une mémoire médiocre).

Un rapide hack en Perl, non testé. Je ne maîtrise pas assez sed ou awk pour obtenir cet effet, mais j'aimerais savoir comment cela se ferait.

#!/usr/bin/perl -w
use strict;
use Tie::File;
my $Filename=shift;  
tie my @File, 'Tie::File', $Filename or die "could not access $Filename.\n";  
while (shift @File !~ /^\*\*\* Start/) {};  
while (pop @File !~ /^\*\*\* Finish/) {};  
untie @File;  

Certains exemples de perlfaq5: comment modifier, supprimer ou insérer une ligne un fichier, ou ajouter au début d'un fichier? peut aider. Vous devrez les adapter à votre situation. En outre, la réponse de l'opérateur de la bascule de Leon est le moyen idiomatique de procéder de la sorte en Perl, bien qu'il ne soit pas nécessaire de modifier le fichier sur place pour l'utiliser.

Une solution Perl qui écrase le fichier d'origine.

#!/usr/bin/perl -ni
if(my $num = /^\*\*\* Start/ .. /^\*\*\* Finish/) {
    print if $num != 1 and $num + 0 eq $num;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top