关于正则表达式:在某些情况下如何对某些字符进行sed,awk或tr?

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

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

1
sed 's/ /,/g'

这里和问题示例

1
2
3
4
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,结果变成

1
2
3
4
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

我无法使用城市名称中的空格。关于如何解决该问题的任何建议?每行的字段编号并不总是组成。根据城市的不同,它将有4个或5个。


尝试一下:

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

输出:

1
2
3
4
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

如果城市始终被数字包围,则只需检查从数字到非数字的转换,反之亦然:

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


使用贪婪的愚蠢而基本的方法:

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

或更短:

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