SED命令问题超过9的值

时间:2013-06-26 11:34:13

标签: sed centos

我需要从file.csv生成一个file.sql文件,所以我使用这个命令:

cat file.csv |sed "s/\(.*\),\(.*\)/insert into table(value1, value2)
values\('\1','\2'\);/g" > file.sql

它完美地工作,但是当值超过9时(例如对于\ 10,\ 11等...),它只考虑第一个数字(在这种情况下为\ 1)并忽略其余部分。

我想知道我是否遗漏了某些东西,或者是否有其他方法可以做到。

谢谢!

编辑:
不工作的例子:

我的file.csv看起来像

2013-04-01 04:00:52,2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27

我得到了什么

  

插入表格   val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14,val15,val16

     

值   ('2013-04-01 07:39:43',
  2,37,74,36526530,3877,0,0,6080,
  2013-04-01 07:39:430,2013-04-01 07:39:431,
  2013-04-01 07:39:432,2013-04-01 07:39:433,
  2013-04-01 07:39:434,2013-04-01 07:39:435,
  2013-04-01 07:39:436);

在第九个元素之后,我得到了第一个元素,而不是第10个,第11个元素......

2 个答案:

答案 0 :(得分:1)

据我所知,sed有限制支持9个反向引用。它可能已在较新版本中删除(但不确定)。最好使用perlawk

以下是awk中的操作方法:

$ cat csv
2013-04-01 04:00:52,2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27

$ awk 'BEGIN{FS=OFS=","}{print "insert into table values (\x27"$1"\x27",$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16 ");"}' csv
insert into table values ('2013-04-01 04:00:52',2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27);

您可以在perl

中执行此操作
$ perl -ple 's/([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)/insert into table values (\x27$1\x27,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16);/' csv
insert into table values ('2013-04-01 04:00:52',2,37,74,40233964,3860,0,0,4878,174,3,0,0,3598,27.00,27);

答案 1 :(得分:1)

尝试awk脚本(基于@JS웃解决方案):

script.awk

#!/usr/bin/env awk
# before looping the file
BEGIN{
  FS="," # input separator
  OFS=FS # output separator
  q="\047" # single quote as a variable
}

# on each line (no pattern)
{
  printf "insert into table values ("
    print q $1 q ", "
    print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  print ");"
}

使用

运行
awk -f script.awk file.csv

一衬垫

awk 'BEGIN{OFS=FS=","; q="\047" } { printf "insert into table values (" q $1 q ", " $2","$3","$4","$5","$6","$7","$8","$9","$10","$11","$12","$13","$14","$15","$16 ");" }' file.csv