sed替换AFTER匹配并保留

时间:2017-08-30 15:04:10

标签: regex shell awk sed

我已经绞尽脑汁待了好几个小时,但看起来很简单。我有一个很大的字符串列表,类似于下面的字符串,并希望将逗号后的连字符替换为逗号:

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"

谢谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一个awk提案。

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

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

答案 2 :(得分:0)

正如OP所提到的,OP的Input_file可能有多个逗号,所以下面的内容可能对你有帮助。

awk -F, 'NF>1{for(i=2;i<=NF;i++){gsub(/-/,",",$i)}} 1' OFS=,  Input_file
abc-d-ef,1,2,3,4
gh-ij,1,2,3,4