Eu li algumas outras perguntas sobre manipulação de string de bash de tubulação, mas elas parecem ser aplicativos especializados.
Essencialmente, existe uma maneira de fazer o abaixo mais simples?
ao invés de
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
algo como
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Editar Estou interessado em permanecer dentro de manipulações do bash, se possível, para manter a velocidade (em vez de sed / awk, que tendem a desacelerar bastante meus scripts)
Edit2: @jimmij
Eu gosto do segundo exemplo e me levou a fazer uma função.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
manual, o oposto será verdadeiro porque o tempo de geração dos processos é insignificante em comparação com o tempo de manipulação de cadeias para o qual sed
e awk
são dedicados. Se a string é extremamente longa, digamos o manual completo do bash, o bash pode se recusar a prosseguir completamente, devido a algumas limitações internas.
sed
, awk
, tr
ou semelhantes. Veja a resposta do gena2x, que eu editei há algum tempo, adicionando exatamente essas informações: unix.stackexchange.com/questions/162221/… você pode compará-lo com terdon answer para a mesma pergunta em que ele dá tempo para seqüências curtas nas quais a geração do processo do caso leva mais tempo. Você pode testá-lo e postar o resultado.
read x; echo $x
é melhor para o desempenho? A sintaxe não parece mais curta ou mais limpa. x=${x// /_}; x=${x^^}
é uma maneira muito mais concisa de fazer a mesma coisa que {read x; echo ${x...
. Quanto ao desempenho, o @jimmij apontou que tr
/ sed
seria mais rápido do que a bash
contagem de garfos sendo igual. O uso de um pipe sempre resulta em um processo extra, portanto o argumento de salvar um garfo não se aplica mais. Portanto, se você estiver usando pipes, use sed
/ tr
etc. Se você puder fazê-lo no bash, faça-o e pule essa read x; echo $x
bobagem.