Use sed com referências de volta

3

Estou tentando remover um espaço entre duas strings, elas são assim:

312.2 MB
123.34 KB
487.1 GB

Eu quero mudá-los para:

312.2MB
123.34KB
487.1GB

Eu tenho tentado e consigo:

echo "312.2 MB" | sed s/[0-9][[:space:]][GMK]//g
312.B

Mas quando tento fazer backreferences com sed :

echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)//g
312.2 MB

Meu palpite é que há apenas uma correspondência e, em seguida, a referência de volta é a correspondência completa, mas:

echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/TRY/g
312.2 MB

Então, não está mais funcionando quando eu uso o () para capturar os caracteres

Provavelmente o regex não está completamente correto, mas não sei por quê.

    
por Franks 14.06.2016 / 08:54

3 respostas

5

O problema está citando.

Como você não cita seu comando sed , o parêntese \(...\) foi interpretado pelo shell antes de passar para sed .

Então, sed os tratou como parênteses literais em vez de parênteses com escape, sem referência anterior afetada.

Você precisa:

echo "312.2 MB" | sed 's/\([0-9]\)[[:space:]]\([GMK]\)//g'

para tornar a referência anterior afetada e obter o que você deseja.

Ou mais simplesmente:

echo "312.2 MB" | sed 's/ //'
    
por 14.06.2016 / 09:06
3

Você não citou nenhuma das expressões sed , que é o principal culpado. coloque aspas em torno dele como sed ' ' . Ou simplesmente você pode conseguir isso seguindo a expressão tr ,

tr -d '[:space:]' <<< "312.2 MB"
312.2MB

tr -d ' ' <<< "123.34 KB"
123.34KB

tr -d '[:blank:]' <<< "487.1 GB"
487.1GB

Se você está insistindo em sed , você pode fazer isso,

sed 's/ //g' 
sed 's/[[:blank:]]//g' 
sed 's/[[:space:]]//g' 
    
por 14.06.2016 / 09:07
1

use bash :

$ txt="32.2 MB"
$ echo ${txt// /}
32.2MB
    
por 14.06.2016 / 09:24