使用sed在数字和单词

时间:2015-09-30 14:23:12

标签: regex bash sed whitespace

我有一系列文件使用fixed with delimiting而不是逗号分隔的分隔符。他们都看起来像这样:

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

我想用逗号替换所有空格。我有一段代码可以实现这个目标:

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.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'

但它似乎没有做任何事情

3 个答案:

答案 0 :(得分:1)

您可以将这个单一的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在两个组之间添加逗号。

答案 1 :(得分:1)

trsed

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

答案 2 :(得分:0)

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