Manipulação de strings de piping

9

Li algumas outras questões de manipulação de strings de tubulação, mas elas parecem ser aplicações especializadas.

Essencialmente, existe uma maneira de fazer o abaixo mais simples?

em vez de

$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD

algo como

$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD

Editar Eu estou interessado em ficar dentro de manipulações bash se possível para manter a velocidade (ao contrário de sed / awk que têm uma tendência a retardar muito 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
    
por Miati 26.10.2014 / 02:45

2 respostas

9

O que jimmij disse. Seu último exemplo é o mais próximo que você pode chegar do que está tentando em sua expressão canalizada.

Aqui está uma variante desse tema:

echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})

Eu estaria inclinado a usar tr , pois é bastante rápido.

echo 'hello world'|tr ' [:lower:]' '_[:upper:]'

Acho que é uma pena que o bash não permita a expansão de parâmetros aninhados; OTOH, o uso de tais expressões aninhadas pode facilmente levar a códigos que são difíceis de ler. A menos que você realmente precise que as coisas sejam executadas o mais rápido possível, é melhor escrever um código que seja fácil de ler, entender e manter, em vez de um código inteligente que depure. E se você realmente fizer precisar que as coisas sejam feitas em alta velocidade, você deve usar código compilado, não um script.

    
por 26.10.2014 / 04:35
7

Você não pode passar expansões de parâmetro de tal maneira. Quando você se referir a x usando o símbolo $ como em "${x}" form, ele terá que ser o nome real da variável, não uma entrada padrão, pelo menos não em bash . Em zsh você pode executar substituições de parâmetros aninhados da seguinte maneira:

$ x=''hello world'
$ echo ${${x// /_}:u}
HELLO_WORLD

(nota: :u é para zsh o mesmo que ^^ para bash )

Aninhar no bash não é possível e acho que o que você escreveu em questão é o melhor que se pode obter, mas se por alguma estranha razão você precisar envolver os pipes na equação, então você pode tentar:

$ echo 'hello world' | { read x; echo "${x// /_}"; } | { read y; echo "${y^^}"; }
HELLO_WORLD
    
por 26.10.2014 / 04:17