我有两个表格如下
,ghjgc b: Int)
,ghjg, b: Int)
我希望删除:
之前的单词 - 但是,如果单词前面有,
- 我不希望删除发生。因此,上面字符串的输出将是
,ghjgc : Int)
,ghjg, b: Int)
我已将正则表达式写为[^,] [^:[:space:]]*:
- 但它将输出显示为
,ghjg : Int)
//note that 'c' at the end of ghjg is also removed
,ghjg, b: Int)
//this is as expected
这个问题的发生可能是因为在正则表达式的开头,我[^,]
在space
正则表达式的一部分之前也添加了一个字符。需要帮助才能解决这个问题
我对字符串做了更多的处理,因此我的sed命令看起来像:
sed -e '
s/^.*func \{1,\}//
s/ *\->.*$//
s/:[^,)]\{1,\}/:/g
s/(?<!,) [^:[:space:]]+:/\1:/g
s/[, ]//g
' <<< "$string"
我在第5行遇到编译错误(行索引从1开始)
答案 0 :(得分:2)
您可以使用
((^|[^,]) +)[^:[:space:]]+:
并替换为\1:
。请参阅regex demo。
要点是匹配字符串的开头或除,
以外的任何字符+一个或多个空格,并将它们捕获到组#1中,然后使用$1
反向引用来恢复它。 / p>
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:
这里使用一个否定的字符类,我们匹配的不是逗号或空格的文本,并将其捕获,以便以后用作反向引用。
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