2009-12-02 4 views
0

Regarder ceci:texte lu et remplacer l'algorithme

MENU_ITEM_BACK#0="Back"; 
MENU_ITEM_BLOCK_CHANNEL#0="Block"; 
MENU_ITEM_CLOSE#0="Close"; 
MENU_ITEM_DETAILS#0="Details"; 
MENU_ITEM_DIAGNOSE#0="Diagnose"; 
MENU_ITEM_DOWNLOAD#0="Download"; 

... et ainsi de suite (plus de 500 lignes). Quel serait le meilleur moyen d'automatiser la copie du nom de l'étiquette dans l'étiquette elle-même? Par exemple,

MENU_ITEM_BACK#0="Back"; 

deviendraient

MENU_ITEM_BACK#0="MENU_ITEM_BACK"; 

Je suis plus familier avec Java, mais ont aucune objection à tout autre langage de programmation, bien que je ne suis pas très familier avec les expressions régulières (celles codées au moins) .

EDIT: Il a été porté à mon attention que les '# 0 =' ne sont pas toujours constants. Parfois, ils peuvent être remplacés par un nombre très arbitraire tel que '# 6548135 ='. Les réponses données étaient bonnes mais comme je ne suis pas familier avec les expressions régulières, comment allez-vous répondre à cela? Notez que je ne veux pas copier le numéro, juste l'étiquette.

+0

Le # 0 est-il constant? Connaissez-vous sed? Rubis? Python? –

Répondre

1

Vous pouvez le faire sans expressions régulières à l'aide de Microsoft Word. Copiez la section du code dans Word. Ensuite, utilisez une sélection de colonne (maintenez la touche alt enfoncée et sélectionnez avec la souris), puis copiez-la vers la droite et nettoyez-la avec recherche et remplacement.

+0

Comment une sélection de colonne fonctionnera-t-elle avec des colonnes de tailles différentes? –

+0

Voici une façon: Ajoutez un espace à droite de chaque ligne. Dans la rangée du haut, ajoutez suffisamment d'espaces, c'est donc la ligne la plus longue. Sélectionnez une colonne de toutes les lignes, assez large pour inclure chaque nom et espace de fin. Collez la colonne assez loin vers la droite pour qu'elle ne chevauche aucun texte. Les espaces sur la première ligne le permettront. Cela fonctionnera, même si les lignes sont de longueur différente. – xpda

+0

Je suis un idiot. A pris 2 minutes en Excel. – Jay

2

Je pense qu'une expression régulière est un bon choix, en supposant que l'étiquette ne peut pas avoir # caractères. Il suffit de remplacer

^([^#]+#0)=".*";$ 

avec

\1="\1"; 

Si vous voulez faire dans un programme ou d'un script, vous devez utiliser votre langue des installations regex de choix.

Si vous voulez faire cela pour une seule fois pour ce dossier, vous pouvez le faire avec sed:

$ sed -e "s/^([^#]+#0)=".*";$/\1=\"\1\"/" file 
1

Une expression régulière, par exemple avec sed:

sed -r 's/^([^#]+)([^=]+)=.*$/\1\2="\1"/' yourfile.txt 

La même chose en Python:

import sys 
import re 

for line in sys.stdin.readlines(): 
    print re.sub('^([^#]+)([^=]+)=.*$', r'\1\2="\1"', line).rstrip() 

Utilisation:

python program.py < yourfile.txt 
1

Utilisez une recherche d'expression régulière et remplacer, comme avec Perl, sed, awk ou pris en charge dans de nombreux éditeurs de texte récents.

En Perl, cela ferait l'affaire:

my $text = <<END_YOUR_TEXT; 
PUT YOUR TEXT HERE 
END_YOUR_TEXT 
$text =~ s/(MENU_ITEM_[^#]+)#0="[^"]+";/$1#0="$1";/g 
print $text; 

Le "$ 1" est une référence à la rencontre entre parenthèses, par exemple MENU_ITEM_BACK.

Pour lire le texte d'un fichier dans la ligne de commande, slurp dans:

mon texte $ = <>;