2013-03-04 3 views
0

Pour mettre en forme des milliers de requêtes SQL, je dois convertir tous les caractères qui ne sont pas entre guillemets en majuscules.Comment faire pour convertir les caractères non cités en majuscules?

Par exemple:

select * from region where regionkey = 'America' 

à convertir en

SELECT * FROM REGION WHERE REGIONKEY = 'America' 

Avec Perl, je suis en mesure de convertir ces caractères cités en majuscules par:

perl -p -e 's/('.+?')/\U\1/g' 

et obtenir :

select * from region where regionkey = 'AMERICA' 

La question est de savoir comment "inverser" le résultat de la capture, disons, de marcher à pas entre guillemets?

+0

sont là les citations dans les citations? par exemple. '' Hawai '' je? – ysth

+0

Les mots clés SQL ne sont pas sensibles à la casse. En quoi est-ce important? –

+0

@JimGarrison Je travaille avec un moteur SQL qui a tous les noms d'objets de base de données (y compris les tables, les vues, les champs) sensibles à la casse. Je me fiche que ce soit "sELECt fROm" ou "sElEcT FoRm", mais REGIONKEY ou RegionKey est important. Dans mon cas d'utilisation tous les objets sont nommés en majuscules, pour simplifier le traitement, je convertis tout en dehors de la citation en majuscule. – zhaow

Répondre

1
s/([^']*)('[^']*'|\z)/\U$1\E$2/g 

si

perl -pe's/([^'\'']*)('\''[^'\'']*'\''|\z)/\U$1\E$2/g' 

ysth suggère une approche guillemet mixte:

perl -pe"s/([^']*)('[^']*'|\z)/"'\U$1\E$2/g' 

Si les citations peuvent avoir antislash échappe à eux, changer

'[^']*' 

à

'(?:[^'\\]+|\\.)*' 
0

Fractionnez la chaîne sur les sous-chaînes entre guillemets et les majuscules toutes les deux parties. Comme cette

my $str = "select * from region where regionkey = 'America'"; 

my $uc; 
$str = join '', map { ($uc = !$uc) ? uc : $_ } split /('[^']*')/, $str; 
print $str; 

sortie

SELECT * FROM REGION WHERE REGIONKEY = 'America' 
+0

Un interligne: 'perl -pe '$ _ = join" ", map {($ uc^= 1)? uc: $ _} split '"/ (' [^ '] *') /" ', $ _ '' – ikegami

Questions connexes