He leído algunas otras preguntas sobre manipulación de cadenas de bash de tuberías, pero parecen ser aplicaciones especializadas.
Básicamente, ¿hay alguna manera de hacer lo siguiente más simple?
en vez de
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
algo como
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Editar Estoy interesado en permanecer dentro de las manipulaciones de bash si es posible para mantener la velocidad (a diferencia de sed / awk, que tienden a ralentizar mis scripts)
Edit2: @jimmij
Me gusta el segundo ejemplo y me llevó a hacer una función.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
manual, entonces lo contrario es cierto porque el tiempo de generación de los procesos es insignificante en comparación con el tiempo de manipulación de la cadena para la cual sed
y awk
son dedicados Si la cadena es extremadamente larga, diga todo el manual de bash, entonces bash puede negarse a continuar por completo, debido a algunas limitaciones internas.
sed
, awk
, tr
o similares. Mire la respuesta gena2x, que edité hace algún tiempo agregando exactamente esta información: unix.stackexchange.com/questions/162221/... es posible que desee compararla con la respuesta terdon a la misma pregunta en la que da tiempo para cadenas cortas en las que el desove del proceso del caso lleva más tiempo. Puede probarlo usted mismo y publicar el resultado.
read x; echo $x
es mejor para el rendimiento? La sintaxis no se ve más corta ni más limpia. x=${x// /_}; x=${x^^}
es una forma mucho más concisa de hacer lo mismo que {read x; echo ${x...
. En cuanto al rendimiento, @jimmij ha señalado que tr
/ sed
sería más rápido que bash
, el recuento de horquillas es igual. Usar una tubería siempre resulta en un proceso adicional, por lo que el argumento de guardar una bifurcación ya no se aplica. Por lo tanto, si está utilizando tuberías, simplemente use sed
/ tr
etc. Si puede hacerlo en bash, hágalo y omita estas read x; echo $x
tonterías.