如何使用sed替换字符串中最后一次出现的字符?


31

如何只使用空格替换字符串中最后一次出现的“-” sed

例如:

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

但我想获得以下输出(用空格替换最后一个连字符[“-”])

swp-RedHat-Linux-OS-5.5.0.0 03

Answers:


48

您可以使用single来完成sed

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

或者,使用扩展的正则表达式:

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

关键是sed非常贪婪,因此请尽可能先匹配多个字符-,包括其他字符-

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

2
注意,这是不可移植的。的某些非GNU版本sed不支持模式匹配。在这种情况下,您将需要其他东西,例如perl -pne 's/(.*)-/$1 /'@Thor的参数扩展解决方案或其他东西。
亚当·卡兹

当然:-) thx ...
Greg

使用单引号时,您不需要转义那些括号。
jgmjgm

@jgmjgm可以通过使用扩展正则表达式来省略反斜杠sed -r
jimmij

1
@VinayPotluri试试看sed -r 's/(.*)-(.*)-/\1 \2 /')
jimmij


11

这样的事情对我有用,尽管我确信有更好的方法

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

这很糟糕...普通的不好。为什么您可以做2时进行4次操作?
Joshpbarron'3

7
对于只对正则表达式有基本了解的人,此答案似乎更加平易近人。谁在乎需要进行多少次操作,对于所有实际情况而言,这都是即时的。因此,我将考虑在某些任意规则上的可读性,以使用尽可能少的操作。
Psirus

5
@Psirus我希望这是不会打开一罐蠕虫,但使用较小的操作思路是向人们展示了一定程度的掌握中的较小的业务。例如,@ Thor的答案显示出对bash参数扩展功能的欣赏,如果OP也使用它,则该功能很好用bash。在可读性(到非常冗长的程度)和使用正确的工具之间将会达到微妙的平衡,但是通常会使用不正确的工具。
hjk 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.