J'ai lu d'autres questions sur la manipulation de chaînes bash de piping mais elles semblent être des applications spécialisées.
Essentiellement, existe-t-il un moyen de faire le plus simple ci-dessous?
au lieu de
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
quelque chose comme
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Edit Je suis intéressé à rester dans les manipulations bash si possible pour maintenir la vitesse (par opposition à sed / awk qui ont tendance à ralentir considérablement mes scripts)
Edit2: @jimmij
J'aime le deuxième exemple et m'a amené à faire une fonction.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
trmanuel, alors l'inverse est vrai parce que le temps d'apparition des processus est négligeable par rapport au temps de manipulation de chaîne pour lequel sedet awksont dédiés. Si la chaîne est extrêmement longue, disons tout le manuel de bash, alors bash peut simplement refuser de continuer, en raison de certaines limitations internes.
sed, awk, trou similaires. Regardez la réponse de gena2x, que j'ai modifiée il y a quelque temps en ajoutant exactement ces informations: unix.stackexchange.com/questions/162221/… vous voudrez peut-être la comparer avec la réponse de terdon à la même question où il donne du temps pour les chaînes courtes dans lesquelles le processus de traitement des cas prend le plus de temps. Vous pouvez le tester vous-même et publier le résultat.
read x; echo $xest meilleur pour la performance? La syntaxe ne semble ni plus courte ni plus propre. x=${x// /_}; x=${x^^}est une manière beaucoup plus concise de faire la même chose que {read x; echo ${x.... En ce qui concerne les performances, @jimmij a souligné que tr/ sedserait plus rapide que bash, le nombre de fourches étant égal. L'utilisation d'un tuyau entraîne toujours un processus supplémentaire, donc l'argument de l'enregistrement d'une fourche ne s'applique plus. Ainsi, si vous utilisez des pipes, utilisez simplement sed/ tretc. Si vous pouvez le faire en bash, faites-le et sautez ce read x; echo $xnon - sens.