将最后两次出现的逗号替换为点

将最后两次出现的逗号替换为点

在每一行中,我想用点替换最后两个逗号

我找到了这样两个 sed 管道方法,但它不适用于 MacOS 上的 sed

$ echo 'abc,def,12379,foo' | sed 's/\(.*\),/\1./'|sed 's/\(.*\),/\1./'
abc,def.12379.foo

有没有一种方法可以适用于任何 sed 版本?不一定仅与 sed 一起使用。

答案1

尝试这个:

$ echo 'abc,def,12379,foo' | sed 's/,\([^,]*\),\([^,]*\)$/.\1.\2/'
abc,def.12379.foo

这将留下仅带有单个逗号的行(例如foo,bar)。这可能是也可能不是您想要的。

\(...\); 的所有版本都应支持替换字符串中的捕获组和\1反向引用。我已经在 Unix v7 上测试了以上内容。\2sed

附言。即使是你问题中的 double sed 也应该在 MacOS 上工作;也许你的问题是这些线是由回车符终止而不是换行?

答案2

echo 'abc,def,12379,foo' | sed -e 's/\(.*\),/\1./' -e 's/\(.*\),/\1./'

或者

echo 'abc,def,12379,foo' | sed -e 's/\(.*\),/\1./;s/\(.*\),/\1./'

答案3

使用awk,将输入视为一组逗号分隔的字段,并用点连接最后三个字段,

echo 'abc,def,12379,foo' |
awk 'BEGIN { OFS=FS="," } { print $1, $2 "." $3 "." $4 }'

相关内容