SEd:用单引号替换空白字符,但引号内除外

时间:2015-01-21 07:16:02

标签: regex sed

此行来自汽车数据集(https://archive.ics.uci.edu/ml/datasets/Auto+MPG) 看起来像这样:

15.0   8.   429.0      198.0      4341.      10.0   70.  1.     "ford galaxie 500"

如何用一个逗号替换多个空格(它有空格和制表符),但不在引号内,最好使用sed,将数据集转换为REAL csv。谢谢!

2 个答案:

答案 0 :(得分:4)

用awk做到这一点:

awk -F'"' 'BEGIN { OFS="\"" } { for(i = 1; i <= NF; i += 2) { gsub(/[ \t]+/, ",", $i); } print }' filename.csv

使用"作为字段分隔符,每隔一个字段将成为应替换空格的行的一部分。然后:

BEGIN { OFS = FS }               # output should also be separated by "
{
  for(i = 1; i <= NF; i += 2) {  # in every second field
    gsub(/[ \t]+/, ",", $i)      # replace spaces with commas
  }
  print                          # and print the whole shebang
}

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 's/\("[^"]*"\|[0-9.]*\)\s\s*/\1,/g' file

这会使用带引号的字符串或十进制数后跟空格,并用逗号替换空格 - 在每一行中。

不太具体使用(根据评论):

sed -r 's/("[^"]*"|\S+)\s+/\1,/g' file