正则表达式将字符串形式转换为另一种形式

时间:2017-02-14 11:34:52

标签: regex

我有两个表格如下

  1. ,ghjgc b: Int)
  2. ,ghjg, b: Int)
  3. 我希望删除:之前的单词 - 但是,如果单词前面有, - 我不希望删除发生。因此,上面字符串的输出将是

    1. ,ghjgc : Int)
    2. ,ghjg, b: Int)
    3. 我已将正则表达式写为[^,] [^:[:space:]]*: - 但它将输出显示为

      1. ,ghjg : Int) //note that 'c' at the end of ghjg is also removed
      2. ,ghjg, b: Int) //this is as expected
      3. 这个问题的发生可能是因为在正则表达式的开头,我[^,]space正则表达式的一部分之前也添加了一个字符。需要帮助才能解决这个问题

        我对字符串做了更多的处理,因此我的sed命令看起来像:

        sed -e ' s/^.*func \{1,\}// s/ *\->.*$// s/:[^,)]\{1,\}/:/g s/(?<!,) [^:[:space:]]+:/\1:/g s/[, ]//g ' <<< "$string"

        我在第5行遇到编译错误(行索引从1开始)

2 个答案:

答案 0 :(得分:2)

您可以使用

((^|[^,]) +)[^:[:space:]]+:

并替换为\1:。请参阅regex demo

要点是匹配字符串的开头或除,以外的任何字符+一个或多个空格,并将它们捕获到组#1中,然后使用$1反向引用来恢复它。 / p>

SED demo

echo ",ghjgc b: Int)" | sed -E 's/((^|[^,]) +)[^:[:space:]]+:/\1:/g'

或BRE版本(demo):

echo ",ghjgc b: Int)" | sed 's/\(\(^\|[^,]\) \{1,\}\)[^:[:space:]]\{1,\}:/\1:/g'

OSX sed note :您必须使用的BRE版本不支持\|,因此您无法使用替换,并且您在开始时无法匹配字符串或同一正则表达式中,以外的字符串。使用

's/\([^,] \{1,\}\)[^:[:space:]]\{1,\}:/\1:/g'

然后,如果你在字符串的开头需要这种匹配:

's/^\( *\)[^:[:space:]]\{1,\}:/\1:/'

答案 1 :(得分:1)

使用搜索:

(,[^,[:blank:]]+[[:blank:]]+)[a-zA-Z0-9]+:

并替换使用:

\1:

这里使用一个否定的字符类,我们匹配的不是逗号或空格的文本,并将其捕获,以便以后用作反向引用。

RegEx Demo

Sed命令:

sed -E 's/(,[^,[:blank:]]+[[:blank:]]+)[a-zA-Z0-9]+:/\1:/' file

,ghjgc : Int)
,ghjg, b: Int)

根据以下评论,OP可以使用此sed命令:

sed -E '
s/(,[^,[:blank:]]+[[:blank:]]+)[a-zA-Z0-9]+:/\1:/
s/^.*func +//
s/ *->.*$//
' file

Working Demo