Regex 使用sed在数字和单词之间插入空格

Regex 使用sed在数字和单词之间插入空格,regex,bash,sed,whitespace,Regex,Bash,Sed,Whitespace,我有一系列的文件使用固定的定界,而不是逗号分隔的定界。它们都是这样的: 2015/09/29 659027 RIH619 25 105.80IN921186 2015/09/29 659027 RIH619 25 105.80IN921186 2015/09/29 659027 RIH619 25 105.80IN921186 2015/09/29 659027 RIH619 25 105.80IN921186 2015/09/29,659027,RIH619,25,105.80,IN9211

我有一系列的文件使用固定的定界,而不是逗号分隔的定界。它们都是这样的:

2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
我想用逗号替换所有空格。我有一段代码可以实现这一点:

sed -r 's/^\s+//;s/\s+/,/g'
运行代码后,我得到以下结果:

2015/09/29,659027,RIH619,25,105.80IN921186
2015/09/29,659027,RIH619,25,105.80IN921186
2015/09/29,659027,RIH619,25,105.80IN921186
2015/09/29,659027,RIH619,25,105.80IN921186
我的问题是我得到的文件在数量和引用之间没有空格。我的输出需要如下所示:

2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29 659027 RIH619 25 105.80IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
我尝试的是:

sed -r 's/^\s+//;s/\.\d\d\D+/\.\d\d,\D/;s/\s+/,/g'

但它似乎没有任何作用

您可以将此单一sed用于以下两个方面:

sed -r 's/[[:blank:]]+/,/g; s/([[:digit:]])([[:alpha:]])/\1,\2/g' file
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
2015/09/29,659027,RIH619,25,105.80,IN921186
  • ([[:digit:]])
    匹配一个数字并在组1中捕获它
  • ([[:alpha:]])
    匹配字母表并在第2组中捕获它
  • \1、\2
    在两个组之间放置逗号

    • awk
      具有固定的字段宽度支持,适用于此类情况:

      $ echo "2015/09/29 659027 RIH619 25 105.80IN921186" | 
          awk 'BEGIN { FIELDWIDTHS="10 1 6 1 6 1 2 1 6 8"; OFS="," }{ print $1,$3,$5,$7,$9,$10 }'
      2015/09/29,659027,RIH619,25,105.80,IN921186
      

      使用
      tr
      sed

       tr ' ' ',' <file | sed -r 's/(\.[0-9]{2})/\1,/'
      

      tr'',“我会在最后一部分使用
      s/[[:alpha:][]+[:digit:][]+$/,&/
      ,达到同样的效果。@anubhava使用
      [[:digit:][]
      [0-9]
      有什么优势吗?在这种情况下,它们的行为应该是相同的,但使用POSIX类被认为是一种更好的做法。这是对我有效的解决方案。我对代码做了一个修改,用一个逗号(而不是多个逗号)替换了许多紧跟在后面的空格:)
      tr-s'','