56

How do I replace only the last occurrence of "-" in a string with a space using sed?

For example:

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

but I want to get the following output ( replacing the last hyphen [“-“] with a space )

swp-RedHat-Linux-OS-5.5.0.0 03

3 Answers 3

72

You can do it with single sed:

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

or, using extended regular expression:

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

The point is that sed is very greedy, so matches as many characters before - as possible, including others -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03
7
  • 4
    Note, this is not portable. Some non-GNU versions of sed do not support pattern matches. In that case, you'll need something else, be it perl -pne 's/(.*)-/$1 /' or @Thor's parameter expansion solution or something else.
    – Adam Katz
    Mar 6, 2015 at 22:02
  • of course :-) thx...
    – Greg
    Jul 12, 2016 at 15:42
  • You shouldn't need to escape those brackets when using single quotes.
    – jgmjgm
    Dec 27, 2017 at 12:27
  • @jgmjgm You can omit backslashes by using extended regular expression with sed -r.
    – jimmij
    Dec 27, 2017 at 13:25
  • 1
    @VinayPotluri Try sed -r 's/(.*)-(.*)-/\1 \2 /').
    – jimmij
    May 8, 2018 at 21:00
42

You could also handle this with bash parameter expansion:

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

Output:

swp-RedHat-Linux-OS-5.5.0.0 03
2
  • Very creative, love this answer
    – dpritch
    Nov 14, 2017 at 22:39
  • Hi Thor. Nice trick. I'd like to do this, but on a Bash array. Any ideas? Feb 7, 2021 at 18:49
19

Something like this worked for me, although I'm sure there are better ways

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
3
  • This is bad...plain bad. Why do 4 operations when you can do 2?
    – Sarima
    Mar 3, 2015 at 14:18
  • 12
    For someone with only a basic understanding of regular expressions, this answers seems much more approachable. And who cares how many operations it takes, this is going to be instantaneous for all practical cases. So I would consider readability over some arbitrary rule to use as few operations as possible.
    – Psirus
    Mar 3, 2015 at 20:38
  • 6
    @Psirus I hope this isn't going to open up a can of worms, but the idea of using lesser operations is to showcase a certain level of mastery of the lesser operations. For example, @Thor's answer shows an appreciation of bash parameter expansion feature, which works well if OP is using bash too. There is going to be a delicate balance between readability (to the point of being very verbose) and using the right tools, but more often than not using the right tools prevails.
    – h.j.k.
    Mar 4, 2015 at 3:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .