【问题标题】:sed replace AFTER match and retainsed 匹配后替换并保留
【发布时间】:2017-08-30 15:04:10
【问题描述】:

我已经为此绞尽脑汁好几个小时了,但这似乎很简单。我有一大串类似于下面的字符串,并且想将连字符仅在逗号之后替换为逗号:

abc-d-ef,1-2-3-4
gh-ij,1-2-3-4

到这里

abc-def,1,2,3,4
gh-ij,1,2,3,4

由于数据不同,我不能使用 s/-/,/2g 来替换第二次出现的内容,而且虽然关于使用 cut,但必须有一种方法可以将 sed 与以下内容一起使用:

"s/\(,\).*-/\1,&/g"

谢谢

【问题讨论】:

  • 你的原始输入可以有多个逗号吗?
  • @Kent yes original 可以有多个逗号;我只需要它在第一个逗号之后采取行动

标签: regex shell awk sed


【解决方案1】:

这更适合awk,因为我们可以使用逗号作为字段分隔符来中断所有行:

awk 'BEGIN{FS=OFS=","} {gsub(/-/, OFS, $2)} 1' file

abc-d-ef,1,2,3,4
gh-ij,1,2,3,4

如果您只想要sed 解决方案,请使用:

sed -E -e ':a' -e 's/([^,]+,[^-]+)-/\1,/g;ta' file

abc-d-ef,1,2,3,4
gh-ij,1,2,3,4

【讨论】:

    【解决方案2】:

    一个 awk 提案。

    awk -F, '{sub(/d-ef/,"def")gsub(/-/,",",$2)}1' OFS=, file
    
    abc-def,1,2,3,4
    gh-ij,1,2,3,4
    

    【讨论】: