J'essaie d'écrire une commande shell où je peux spécifier un répertoire, puis chaque fichier et répertoire à l'intérieur aura la première lettre de chaque mot capitalisé. Donc
doit changer sur p> Je pense que cela devrait commencer comme p> Le problème que je ne puisse pas comprendre est de faire uniquement la première lettre. J'ai fait un script qui majuscule tout le nom du fichier, mais je ne peux pas comprendre comment obtenir la première lettre de chaque mot. P> Merci! P> P> /documents/test.txt code> p> /documents/test.txt code> p >
5 Réponses :
Vous pouvez le faire assez facilement avec GNU SED. Par exemple: p> Notez que l'évacuation de \ u est une extension GNU SED. Le manuel dit: P> Enfin, comme une extension GNU 'SED', vous pouvez inclure une séquence spéciale constituée d'une barre oblique inverse et d'une des lettres 'L', 'L', 'U', 'U', ou 'E'. < / p>
blockQuote> limitations h3>
Cela ne fait rien pour moi.
Bash 4.0+ a une substitution de paramètres 'minuscule à majuscule'. Changer seulement
Le premier caractère l'utilise comme ceci: le résultat: p>
Cela n'aide pas l'OPS à utiliser un cas de capitalisation après chaque composant de chemin. Si vous pouvez montrer comment faire l'expansion majuscule sur plusieurs parties des chemins de chemin à l'aide de Pure Bash, ce serait une bonne réponse, mais je ne pouvais pas trouver un moyen de faire ce produit sans passer de multiples passages sur la chaîne.
Vous pouvez faire une deuxième boucle interne avec ifs = / code> pour scinder les composants de la cheminée.
Changé après le commentaire de Tripleee.
Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'` echo $Target One Two Three Four
Ne fonctionne que pour les personnages A-Z, et non pour les caractères internationaux.
Exactement ce que je cherchais!
@svante, regardez la décomposition / normalisation du personnage Unicode, ici et ici . Décomposez , recherchez ce code, utilisez ce code, puis Recombine . Ce n'est pas tout bash code>, bien que l'on puisse écrire une version bash code>.
Évitez la boucle à l'aide des fonctionnalités de Bash v4 : Vous pouvez l'intégrer dans une fonction de coquille: P> $ capitalize_subdirs '/doCumenTS/tesT.txt'
/DoCumenTS/TesT.txt
$ capitalize_subdirs $'/d\noCu\tme nTS/tesT.txt'
/D
oCu me nTS/TesT.txt
Malheureusement, bash-seulement, pas même à Zsh: /
Avant: modification: p> après: p> $ find . -mindepth 1 -depth -print
./Foo/Baz/File4
./Foo/Baz
./Foo/File2
./Foo
./Bar/File3
./Bar
./File1
La clé ici consiste ici à utiliser l'option -Depth code> Rechercher afin de vous assurer que les fichiers d'un répertoire sont renommés avant le répertoire lui-même.
trouver. -Mindepth 1 -Depth -execcdir bash -c 'f = $ {0 #. /}; mv - "$ f" "$ {f ^}" '{} \; code>
Il n'y a aucun moyen de limiter le contexte de
tr code>, donc c'est définitivement la mauvaise commande ici. Il substitue toujours toutes les occurrences des caractères que vous fournissez comme arguments.Cela pourrait aider: Theunixshell.blogspot.com/ 2013/02 / ...