0
votes

Comment majuscule le premier caractère d'une sous-chaîne uniquement s'il a plus de 3 caractères

Je dois transformer cette chaîne:

Mon nom est l'utilisateur d'ici pas là-bas.

à:

Mon nom est user d'ici pas

Les détails sont, j'ai besoin de monter le premier char de n'importe quel mot avec plus de 3 caractères. Juste ça. J'essaie sans succès avec ces commandes: xxx

tout le reste doit être minuscule.


3 commentaires

Tout en voyant votre profil, vous devez savoir que vous ne choisissez jamais une réponse aussi correcte, donnez-lui de même et lorsque vous avez des réponses, essayez de sélectionner quelqu'un d'entre eux aussi correct.


Votre titre de question dit plus de 2, mais le corps demande plus de 3. s'il vous plaît Modifier pour faire cela cohérent ou clarifier .


Merci pour les commentaires, ma question était mal formulée, je suppose maintenant est plus claire. À propos de la sélection de la réponse correcte Ravindersingh13, vous êtes correct, mais dans ma vieille question, je cherchais toujours plus de réponses, car aucun d'entre eux ne pouvait résoudre le problème, mais je suppose que personne ne va répondre maintenant.


4 Réponses :


1
votes

Pourriez-vous essayer de suivre. XXX PRE>

Résultat: P>

my Name is User From Here not There.


2 commentaires

Merci @triTleee pour le modifier, j'ai oublié d'ajouter une forme de solution à une doublure.


Merci! Fonctionne bien, à l'exception du premier mot qui devrait avoir le premier caractère en majuscule.



2
votes

Utilisation gnu sed , (et bash ): xxx

ou: xxx

sortie: xxx


notes:

"$ {f ,} " est un bash Extransion de paramètre de modification de cas , il retourne un bas -Case version de $ f , qui devient l'entrée de sed .

gnu sed offre une offre utile Synonymes et abréviations pour communs regex classes de caractères. La classe de caractères [A-ZA-Z0-9 _] peut être abrégée sous forme [[[: alpha:] _] ou plus simple \ w .

même si \ u ressemble à un regex abréviation, ce n'est pas le cas. C'est un "Séquence spéciale" utilisée uniquement dans s ubstitute text de remplacement - \ u signifie "Tournez le caractère suivant sur majuscule" .

& fait référence à ce que fait le premier regexp dans le s commande ubstitute correspondance. Comparez les éléments suivants: xxx

Voir le gnu SED pages d'information pour plus de détails.


3 commentaires

Parfait! Je devais ajouter tr '[: supérieure:]' '[: inférieur:]' Tout d'abord que d'utiliser votre solution ou ce ne serait pas un généraliste comme dont j'ai besoin. Je cherche vraiment dans la documentation SED mais je ne pouvais pas comprendre comment ces groupes fonctionnent (\ W {4}) \ B, \ u, \ s, pourquoi une barre oblique et un nombre après \ u par exemple, ou &. \ w signifie n'importe quel mot? est comme Regexp? Pourriez-vous expliquer un peu?


@Otavio, voir Réponse plus générale - Le TR ne doit plus être nécessaire.


Merci! En utilisant ce que vous avez dit dans Notes, j'ai repris le commando à echo $ peine | Sed -e 's /./ \ l & / g; S /^./ \ u & /; s / (\ b) (\ w \ 4}) / \ 1 \ u \ 2 / g' . Sans utiliser de tr. Voudrais utiliser Pearl, pour la portabilité, comme l'a dit Triplee, mais n'avait aucun succès.



1
votes

tr code> n'est pas vraiment le bon outil pour ce travail; Il ne sait pas du contexte du tout.

Certaines variantes de SED code> ont perl ou VI code> extensions de regex, mais cela ne peut pas vraiment être résolu de manière portant avec SED , soit. P>

Perl à la rescousse: p>

bash$ foo="my name is user from here not there."

bash$ echo "$foo" | perl -pe 's/\w{4,}/\u$&/g'
my Name is User From Here not There.


2 commentaires

Fonctionne bien, sauf pour le premier mot comme vous l'avez dit. Perl semble une bonne option pour remplacer SED, comme je le souhaite à l'avenir d'utiliser ces scripts dans Mac OSX. Merci pour votre réponse!


Changer le regex vers ^ \ w + | \ w {4,} prend en charge la capitalisant toute lettre initiale aussi si vous le souhaitez.



2
votes

Cela pourrait fonctionner pour vous (GNU SED): xxx

majuscule le premier caractère d'un mot si ce mot apparaît dans une ligne qui commence par un mot ou un mot 4 ou Plus de caractères long


3 commentaires

À première vue, cela ne semblait pas très différent mon sed réponse , mais le | et le remplacement unique sont des améliorations claires. Un tweak - remplacer ^ \ w + avec ^. et fonctionne toujours.


Fonctionne vraiment bien. Comme je l'ai dit dans AGC Réponse, je devais tout minuscule avant d'appliquer votre filtre SED, ou des phrases comme si mon nom n'est pas Smith, ne fonctionnerait pas. Désolé pour mon ignorance. J'ai compris jusqu'au dernier \ B, mais comment ça marche? J'ai essayé beaucoup de combinaisons différentes mais sans succès.


@Otavio \ u & fait le premier caractère de la chaîne correspondant à la LHS de la commande de substitution, majuscule.