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
tr
manuel, 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 sed
et awk
sont 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
, tr
ou 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 $x
est 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
/ sed
serait 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
/ tr
etc. Si vous pouvez le faire en bash, faites-le et sautez ce read x; echo $x
non - sens.