Como substituo a última ocorrência de um caractere em uma string usando sed?

27

Como faço para substituir apenas a última ocorrência de "-" em uma string com um espaço usando sed ?

Por exemplo:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

mas quero obter a seguinte saída (substituindo o último hífen [“-“] por um espaço)

swp-RedHat-Linux-OS-5.5.0.0 03
    
por maihabunash 03.03.2015 / 12:47

3 respostas

39

Você pode fazer isso com um único sed :

sed 's/\(.*\)-/ /'

ou, usando expressão regular estendida:

sed -r 's/(.*)-/ /'

O ponto é que sed é muito guloso, então, combina tantos caracteres antes de - quanto possível, incluindo outros - .

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/ /'
swp-RedHat-Linux-OS-5.5.0.0 03
    
por 03.03.2015 / 13:06
24

Você também pode lidar com isso com a expansão do parâmetro bash :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Saída:

swp-RedHat-Linux-OS-5.5.0.0 03
    
por 03.03.2015 / 15:32
11

Algo assim funcionou para mim, embora eu tenha certeza de que há maneiras melhores

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
    
por 03.03.2015 / 12:55