2012-06-18 4 views
0

J'ai un fichier texte contenant des chaînes à chiffrer. Ces chaînes sont indiquées par des tags.UNIX: Comment rechercher et remplacer une chaîne par une fonction

Exemple:

This is an <tag> example </tag>. 

Quelle est la meilleure façon UNIX (en utilisant les outils communs comme sed, bash, etc.) pour rechercher toutes les occurrences et en même temps de le remplacer par la valeur chiffrée (ce est une fonction de la chaîne à l'intérieur des balises)?

Résultat:

This is an <tag> <encrypted value here> </tag>. 

Merci à l'avance!

+0

pourquoi vous rééditant votre question chaque fois que je fixe la mise en forme ??? – khachik

+0

Avez-vous ignoré les espaces autour de ' exemple '? – kev

+0

@khachik Je ne savais pas que vous étiez en train de corriger le formatage. J'essayais de le résoudre moi-même – bancsy

Répondre

0

Ok, j'ai pu trouver une solution il y a quelques jours. J'ai utilisé bash et expressions régulières.

Voici comment je l'ai fait:

#!/bin/bash 

REGEX='^(.*<tag>)(.*)(<\tag>.*)$' 

function process() 
{ 
    RESULT= #do processing of $1 here 
} 

while read line ; do 
    while [[ $line =~ "$REGEX" ]] ; do 
     process "${BASH_REMATCH[2]}" 
     line="${BASH_REMATCH[1]}$RESULT${BASH_REMATCH[3]}" 
    done 
    echo "$line" > "$OUTPUT_FILE" 
done < "$FILE" 
0

quatre conditions peu claires: En supposant

  1. L'étiquette ouverture et la fermeture ne doivent pas être dans la même ligne.
  2. La fonction de chiffrement n'est pas un changement trivial.
  3. Il existe un seul type de tag.
  4. Il n'y a aucune imbrication d'aucune sorte.

Dans ce cas, bash, sed, awk peuvent tous être trop encombrants. Il vaut mieux utiliser Perl ou Python. Voici un algo:

  1. initialiser un tag_flag à 0.
  2. mot de fichiers en lecture par mot (ou ligne par ligne, divisant chaque ligne).
  3. Alors que tag_flag est 0, et que vous ne trouvez pas la balise d'ouverture, affichez tout tel quel.
  4. Lorsque vous rencontrez la balise d'ouverture, définissez tag_flag sur 1. Continuez à lire mot par mot à collecter dans une chaîne to_be_encrypted.
  5. Lorsque vous tombez sur la balise de fermeture, la sortie d'impression de la fonction de chiffrement sur to_be_encrypted et mis tag_flag à 0.
Questions connexes