我想替换以下
word-3.4.4-r0-20170804_101145
second-example-3.4.4-r0-20170804_101145
and-third-example-3.4.4-r0-20170804_101145
我希望用冒号取代前3个之前的连字符,例如
word:3.4.4-r0-20170804_101145
second-example:3.4.4-r0-20170804_101145
and-third-example:3.4.4-r0-20170804_101145
到目前为止,我能得到的最接近的是
newvar=$(echo "$var" | sed 's/-[0-9]/:/')
但是此解决方案将-3替换为:
word:.4.4-r0-20170804_101145
second-example:.4.4-r0-20170804_101145
and-third-example:.4.4-r0-20170804_101145
答案 0 :(得分:0)
您可以使用
sed 's/^\([^0-9-]*\(-[^0-9-]*\)*\)-\([0-9]\)/\1:\3/'
请参阅online demo
<强>详情
^
- 开始行\([^0-9-]*\(-[^0-9-]*\)*\)
- 第1组:
[^0-9-]*
- 除数字和-
\(-[^0-9-]*\)*
- (第2组)0 + -
的序列和除数字以外的任何0+字符-
-
- 连字符\([0-9]\)
- 第3组 \1
是对第1组内容的反向引用,\3
是对第3组内容的反向引用。
答案 1 :(得分:0)
你快到了。只需使用捕获的组来保留数字:
newvar=$(sed 's/-\([0-9]\)/:\1/' <<< "$var")
结果:
echo "$newvar"
word:3.4.4-r0-20170804_101145
second-example:3.4.4-r0-20170804_101145
and-third-example:3.4.4-r0-20170804_101145
答案 2 :(得分:0)
#python3 tenzin
def changenum(data):
foo = ""
for i in list(data):
if i == ",":
continue
else:
foo += i
return float(int(foo))
与其他答案非常相似,但我更喜欢使用sed的-r选项,这允许构造一个更容易阅读的sed String,因为它具有更少的\来解析。与其他答案一样,数字由([0-9])捕获,然后由\ 1替换。