Vamos ver. O mais curto que eu puder apresentar é um ajuste da sua solução tr
:
OUTPUT="$(tr -d "\"\''" <<<$OUTPUT)"
Outras alternativas incluem a substituição de variável já mencionada, que pode ser menor do que a mostrada até agora:
OUTPUT="${OUTPUT//[\'\"\']}"
E sed
, é claro, mas isso é mais longo em termos de caracteres:
OUTPUT="$(sed s/[\'\"\']//g <<<$OUTPUT)"
Não sei se você quer dizer o menor tempo ou o tempo gasto. Em termos de comprimento, esses dois são tão curtos quanto possível (ou como eu posso obtê-lo de qualquer maneira) quando se trata de remover esses caracteres específicos. Então, qual é o mais rápido? Eu testei definindo a variável OUTPUT
para o que você tinha no seu exemplo, mas repeti várias dúzias de vezes:
$ echo ${#OUTPUT}
4900
$ time tr -d "\"\''" <<<$OUTPUT
real 0m0.002s
user 0m0.004s
sys 0m0.000s
$ time sed s/[\'\"\']//g <<<$OUTPUT
real 0m0.005s
user 0m0.000s
sys 0m0.000s
$ time echo ${OUTPUT//[\'\"\']}
real 0m0.027s
user 0m0.028s
sys 0m0.000s
Como você pode ver, o tr
é claramente o mais rápido, seguido de perto por sed
. Além disso, parece que usar echo
é realmente um pouco mais rápido do que usar <<<
:
$ for i in {1..10}; do
( time echo $OUTPUT | tr -d "\"\''" > /dev/null ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0025
$ for i in {1..10}; do
( time tr -d "\"\''" <<<$OUTPUT > /dev/null ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0029
Como a diferença é pequena, eu corri os testes acima 10 vezes para cada um dos dois e acontece que o mais rápido é de fato o que você tinha que começar:
echo $OUTPUT | tr -d "\"\''"
No entanto, isso muda quando você leva em conta a sobrecarga de atribuir a uma variável, aqui, usando tr
é um pouco mais lento que a substituição simples:
$ for i in {1..10}; do
( time OUTPUT=${OUTPUT//[\'\"\']} ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0032
$ for i in {1..10}; do
( time OUTPUT=$(echo $OUTPUT | tr -d "\"\''")) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0044
Então, em conclusão, quando você simplesmente deseja visualizar os resultados, use tr
, mas se quiser reatribuir a uma variável, usar os recursos de manipulação de string do shell é mais rápido, pois eles evitam a sobrecarga de execução de uma subpela separada.