如何在特定情况下使用 sed、awk 或 tr 特定字符?

How to sed, awk, or tr certain characters in certain situations?

我怎么能 awk、sed 或 tr a " " 并将其替换为 ","。更具体地说,当每行的字段数不同时。我知道如何简单地解决问题

sed 's/ /,/g'

这是一个问题示例

Ted 36 Shaker Heights 04-25-1978
Robin 34 Vancouver 07-23-1980
Marshall 36 St. Cloud 11-28-1978
Lily 37 New York 03-22-1978

我需要 sed、awk 或 tr,这样结果就变成了

Ted,36,Shaker Heights,04-25-1978
Robin,34,Vancouver,07-23-1980
Marshall,36,St. Cloud,11-28-1978
Lily,37,New York,03-22-1978

我在使用城市名称中的 space 时遇到问题。关于如何解决这个问题的任何建议?每行的字段编号并不总是一致的。根据城市的不同,它将有 4 个或 5 个。

如果城市总是被数字包围,您可以只检查从数字到非数字的转换,反之亦然:

sed 's/\([0-9]\) \([^0-9]\)/,/g;s/\([^0-9]\) \([0-9]\)/,/g'

试试这个:

sed -E 's/ ([0-9]+) /,,/;s/ ([0-9-]+)$/,/' file

输出:

Ted,36,Shaker Heights,04-25-1978
Robin,34,Vancouver,07-23-1980
Marshall,36,St. Cloud,11-28-1978
Lily,37,New York,03-22-1978

一种使用贪心的愚蠢而基本的方法:

sed -r 's/^([^ ]*) ([0-9]*) (.*) /,,,/' file

或更短:

sed -r 's/ ([0-9]*) (.*) /,,,/' file