2010-11-09 16 views
0

Par exemple, mon src.tex estComment transférer des caractères entre majuscules et minuscules avec sed

SectionType * p = NULL;

et je veux changer de

section_type * p = NULL;

ce que je veux faire est de changer juste la SectionType, mais reste le NULL inchangée, je y/[A-Z]/[a-z], mais cela va changer toute la ligne.

Mes sed ne supportent pas les fonctions \ L, \ I, \ U et \ u, la version est 3. * et distribuée sous FSF, pas GNU, peut être GNU fonctionne bien avec cette fonction, mais à l'époque Je ne pouvais pas adopter les GNU parce que je travaille dans msys et il n'y a pas de paquet GNU.

Y at-il une solution pour l'obtenir?

+0

http://gnuwin32.sourceforge.net/packages/sed.htm –

+0

Ah, je raté la partie de pas GNU. Utilisez le lien d'Ignacio et le sed que j'ai posté et vous devriez aller bien. –

Répondre

1

De here

Autre CamelCase ou camelCase à camel_case:

sed -e 's/\([A-Z][a-z]\)/_\l\1/g' -e 's/^_\([a-z]\)/\1/g' file.txt

entrée:

SectionType *p = NULL; 
sectionType *p = NULL; 
ABCSectionType *p = NULL; 

sortie:

section_type *p = NULL; 
section_type *p = NULL; 
ABC_section_type *p = NULL; 
+0

hmm ... cela semble piétiner le 'NULL'. Vous cherchez une solution. EDIT: fixe. a ajouté le '[a-z]' sur la première expression pour qu'il ignore les choses dans toutes les majuscules. –

+0

J'ai essayé votre script dans MSYS, mais je ne peux toujours pas travailler avec mon sed, parce que votre script utilisait un ** \ l ** pour transférer le premier caractère, et mes sed ne supportaient pas la fonction ... – coanor

+0

Je télécharge un GNU distribution de sed, nommez-le comme 'gsed', et mettez-le sous ** MSYS/bin **, cela fonctionne bien avec votre script, et nous pouvons utiliser ** - i ** pour écraser le fichier que nous devons transférer, enregistrer beaucoup de touches sur la ligne de commande. :) de toute façon, nous devrions tester chaque version de sed pour que notre script fonctionne la plupart du temps. Merci pour votre conseil. :) – coanor

1

Cela devrait fonctionner sans avoir à installer une autre version de sed. Cela ne change le cas que sur le premier mot de la ligne.

upper=$(printf "%s" {A..Z}) 
lower=$(printf "%s" {a..z}) 
sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile 

Ma version de sed ne le fera pas y/[A-Z]/[a-z]/, il a besoin de chaque caractère explicitement inclus, ce qui est la raison pour laquelle je les variables. La façon dont je les ai créés dépend d'une fonctionnalité que seuls certains shells, tels que Bash et ksh, ont. Vous pouvez faire une cession simple ou utiliser la plage si votre sed le supporte.

Si votre version de sed est très pointilleuse, elle peut vouloir -e au lieu de points-virgules. Cette version devrait fonctionner dans ce cas:

sed -e "s/ /\n/" -e "h" -e "s/[^\n]*\n//" -e "x" -e "s/\n.*//" -e "y/$upper/$lower/" -e "G" -e "s/\n//" inputfile 
+0

Actuellement, je ne connais pas ces fonctionnalités avancées de sed, avec seulement 3 jours d'apprentissage, je viens d'avoir une expression régulière et une syntaxe de remplacement utilisée dans sed ... mais votre code est merveilleux, et je le teste vraiment dans mon sed, comme votre dit, fonctionne bien, et ... difficile de taper autant de caractères sans ** ctrl + c/v ** .. :) – coanor