【问题标题】:How to sed, awk, or tr certain characters in certain situations?如何在某些情况下 sed、awk 或 tr 某些字符?
【发布时间】:2015-04-12 04:09:37
【问题描述】:

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

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

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

【问题讨论】:

  • 如果不总是相同,请显示一些发生这种情况的示例输入
  • 我做到了。 3 行有 5 个字段,1 行(第 2 行)有 4 个字段。它始终是姓名、年龄、城市、出生日期。
  • 所以目标是用逗号替换第一个,第二个和最后一个空格,对吗?或者空格也可以出现在另一个字段中?
  • @Wintermute 我猜名称中可能会出现空格。就像某人的名字是安玛丽一样。

标签: regex bash unix awk sed


【解决方案1】:

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

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

【讨论】:

  • 哇,这是一个很棒的解决方案,没想到会这样做!仅供参考,如果城市周围没有数字,你会怎么做?
  • 如果城市仍然是唯一的多词列,则可以从左数和从右数空格。如果两个多字列放在一起,那你就不走运了。
【解决方案2】:

试试这个:

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

输出:

泰德,36 岁,Shaker Heights,1978 年 4 月 25 日 罗宾,34 岁,温哥华,1980 年 7 月 23 日 马歇尔,36,圣。云,11-28-1978 莉莉,37,纽约,03-22-1978

【讨论】:

    【解决方案3】:

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

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

    或更短:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2012-04-01
      • 2020-12-09
      • 1970-01-01
      • 2013-07-28
      • 2014-04-28
      • 2015-01-28
      相关资源
      最近更新 更多