2010-07-10 4 views
2

Ceci est lié à une autre question/code-golf j'ai demandé sur Code golf: "Color highlighting" of repeated textShell script pour trouver, rechercher et remplacer tableau de chaînes dans un fichier

J'ai un fichier « sample1.txt » avec le contenu suivant :

LoremIpsumissimplydummytextoftheprintingandtypesettingindustry.LoremIpsumhasbeentheindustry'sstandarddummytexteversincethe1500s,whenanunknownprintertookagalleyoftypeandscrambledittomakeatypespecimenbook. 

J'ai un script générant le tableau suivant de chaînes qui se produisent dans le fichier (seulement quelques montré pour illustration):

LoremIpsum 
LoremIpsu 
dummytext 
oremIpsum 
LoremIps 
dummytex 
industry 
oremIpsu 
remIpsum 
ummytext 
LoremIp 
dummyte 
emIpsum 
industr 
mmytext 

J'ai besoin de (du haut) voir si 'LoremIpsum' se produit dans le fichier sample1.txt. Si oui, je veux remplacer toutes les occurrences de LoremIpsum par: . Maintenant, lorsque le programme passe au mot suivant 'LoremIpsu', il ne doit PAS correspondre au texte dans sample1.txt. Il devrait répéter ce qui précède pour tous les éléments de ce 'tableau'. Le prochain "valide" serait "dummytext" et qui devrait être étiqueté comme <T2>dummytext</T2>.

Je pense qu'il devrait être possible de créer une solution de script shell bash pour cela plutôt que de se fier aux programmes perl/python/ruby.

+0

Cela ressemble à un travail pour sed, mais la question n'est pas clair pour moi. – Marco

+0

Salut Marco - l'exemple T2 aide-t-il? – RubiCon10

+1

Pourquoi voulez-vous utiliser un script shell? Pourquoi ne pas utiliser l'outil le mieux adapté au travail? Perl a été créé pour le traitement de texte à faible temps de programmation. – Borealid

Répondre

0

bash pur (sans externes)

Sur la ligne de commande bash:

$ sample="LoremIpsumissimplydummytextoftheprintingandtypesettingindustry.LoremIpsumhasbeentheindustry'sstandarddummytexteversincethe1500s,whenanunknownprintertookagalleyoftypeandscrambledittomakeatypespecimenbook." 
$ # or: sample=$(<sample1.txt) 
$ array=(
LoremIpsum 
LoremIpsu 
dummytext 
... 
) 
$ tag=0; for entry in ${array[@]}; do test="<[^>/]*>[^>]*$entry[^<]*</"; if [[ ! $sample =~ $test ]]; then ((tag++)); sample=${sample//${entry}/<T$tag>$entry</T$tag>}; fi; done; echo "Output:"; echo $sample 
Output: 
<T1>LoremIpsum</T1>issimply<T2>dummytext</T2>oftheprintingandtypesetting<T3>industry</T3>.<T1>LoremIpsum</T1>hasbeenthe<T3>industry</T3>'sstandard<T2>dummytext</T2>eversincethe1500s,whenanunknownprintertookagalleyoftypeandscrambledittomakeatypespecimenbook. 
+0

merveilleux btw !! – RubiCon10

0

franc avec Perl:

#! /usr/bin/perl 

use warnings; 
use strict; 

my @words = qw/ 
    LoremIpsum 
    LoremIpsu 
    dummytext 
    oremIpsum 
    LoremIps 
    dummytex 
    industry 
    oremIpsu 
    remIpsum 
    ummytext 
    LoremIp 
    dummyte 
    emIpsum 
    industr 
    mmytext 
/; 

my $to_replace = qr/@{[ join "|" => 
         sort { length $b <=> length $a } 
         @words 
        ]}/; 

my $i = 0; 
while (<>) { 
    s|($to_replace)|++$i; "<T$i>$1</T$i>"|eg; 
    print; 
} 

course de l'échantillon (enveloppé pour empêcher le défilement horizontal):

$ ./tag-words sample.txt 
<T1>LoremIpsum</T1>issimply<T2>dummytext</T2>oftheprintingandtypesetting<T3>indus 
try</T3>.<T4>LoremIpsum</T4>hasbeenthe<T5>industry</T5>'sstandard<T6>dummytext</T 
6>eversincethe1500s,whenanunknownprintertookagalleyoftypeandscrambledittomakeatyp 
especimenbook.

Vous pouvez objecter que toutes les affaires qr// et @{[ ... ]} sont sur le côté baroque. On pourrait obtenir le même effet avec le commutateur /o d'expression régulière comme dans

# plain scalar rather than a compiled pattern 
my $to_replace = join "|" => 
       sort { length $b <=> length $a } 
       @words; 

my $i = 0; 
while (<>) { 
    # o at the end for "compile (o)nce" 
    s|($to_replace)|++$i; "<T$i>$1</T$i>"|ego; 
    print; 
} 
+0

Salut gbacon - umm - le second remplacement devrait être "T2", troisième - "T3" ... juste fyi - je sais que c'est un changement mineur pour votre code – RubiCon10

+0

@ RubiCon10 Ack! Merci et fixé! –

Questions connexes