如何在某些情况下sed,awk或tr某些字符?

时间:2015-04-11 19:52:36

标签: regex bash unix awk sed

我如何使用" "来取消,点击或转发","并将其替换为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

这是一个问题的例子

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}}

我在城市名称中的空间遇到了麻烦。关于如何解决这个问题的任何建议?每行的字段编号并不总是包含在内。它将有4或5取决于城市。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

试试这个:

sed -E 's/ ([0-9]+) /,\1,/;s/ ([0-9-]+)$/,\1/' 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

答案 2 :(得分:1)

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

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

或更短:

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