web-dev-qa-db-fra.com

Comment remplacer la dernière occurrence d'un caractère dans une chaîne à l'aide de sed?

Comment remplacer uniquement la dernière occurrence de "-" dans une chaîne par un espace utilisant sed?

Par exemple:

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

mais je veux obtenir la sortie suivante (en remplaçant le dernier tiret [“-“] par un espace)

swp-RedHat-Linux-OS-5.5.0.0 03
32
maihabunash

Vous pouvez le faire avec un seul sed:

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

ou, en utilisant une expression régulière étendue:

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

Le fait est que sed est très gourmand, donc correspond à autant de caractères avant - autant que possible, y compris d'autres -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03
49
jimmij

Vous pouvez également gérer cela avec expansion des paramètres bash :

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

Production:

swp-RedHat-Linux-OS-5.5.0.0 03
28
Thor

Quelque chose comme ça a fonctionné pour moi, même si je suis sûr qu'il existe de meilleures façons

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
11
rahul