在每一行中,我想用点替换最后两个逗号
我找到了这样两个 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 上测试了以上内容。\2
sed
附言。即使是你问题中的 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 }'