搜索并替换多个相同模式的出现

时间:2017-08-17 13:58:38

标签: bash sed pattern-matching

我想替换以下

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

3 个答案:

答案 0 :(得分:0)

您可以使用

sed 's/^\([^0-9-]*\(-[^0-9-]*\)*\)-\([0-9]\)/\1:\3/'

请参阅online demo

<强>详情

  • ^ - 开始行
  • \([^0-9-]*\(-[^0-9-]*\)*\) - 第1组:
    • [^0-9-]* - 除数字和-
    • 以外的任何0 +字符
    • \(-[^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替换。