Substituição de Combinação Bash e Extração de Subcadeia em uma Etapa

1

Para uma string neste formato:

./my-site.sub.domain.com

Gostaria de remover os . , - e / e aparar o restante para 16 caracteres: mysitesubdomainc

Eu fiz isso

mysite="./my-site.sub.domain.com"
mysite=${mysite//[\.|\/|-]//}
mysite=${mysite:0:16}
echo $mysite
mysitesubdomainc

Existe uma maneira de combinar a extração de substituição e subcadeia de caracteres?

    
por KM. 25.09.2014 / 22:21

3 respostas

3

Não há como encadear a expansão de parâmetros do Bash, mas é claro que isso pode ser feito de uma só vez. linha com ferramentas externas como sed :

$ sed 's/[\.\/-]//g;s/^\(.\{16\}\).*//' <<< "./my-site.sub.domain.com"
mysitesubdomainc

Infelizmente, isso rapidamente se transforma em um código que não pode ser mantido, e é provavelmente menos eficiente do que usar os internos do Bash, então eu aconselho contra isso.

    
por 25.09.2014 / 23:08
2

Por que não usar zsh?

$ echo ${${mysite//[\.\/-]/}:0:16}
mysitesubdomainc

(modifiquei ligeiramente o seu código)

    
por 25.09.2014 / 23:23
1

Como disse @ l0b0, eu não acho que isso pode ser feito em uma única etapa no shell, mas é simples o suficiente para fazer com ferramentas externas (isso assume que a string é salva na variável $s ):

$ perl -pe 's#[.\-/]##g' <<<$s | grep -oP .{16}
mysitesubdomainc
    
por 25.09.2014 / 23:53