1

我有一个包含以下行的文件

insert into table_name    (params1,params2,params3)  values (43044,'x',23547003);
insert into table_name    (params1,params2,params3)  values (43024,'y',26557003);
.....

我想删除第一列/值对。即这是所需的输出。

insert into table_name    (params2,params3)  values ('x',23547003); 
insert into table_name    (params2,params3)  values ('y',26557003);

我怎样才能做到这一点?

这是我到目前为止所做的

cat file_name | sed 's/params1,//g' 

这将删除 params1 但如何删除值后的数字?

Tl;博士

从 更改insert into table_name (params2,params3) values (43024,'y',26557003);insert into table_name (params2,params3) values ('y',26557003);

4

5 回答 5

2

您可以使用:

sed -e 's/params1,//' -e 's/values ([^,]*,/values (/'

根据以下成绩单:

pax> cat infile
insert into table_name    (params1,params2,params3)  values (43044,'x',23547003);
insert into table_name    (params1,params2,params3)  values (43024,'y',26557003);

pax> sed -e 's/params1,//' -e 's/values ([^,]*,/values (/' infile
insert into table_name    (params2,params3)  values (x,23547003);
insert into table_name    (params2,params3)  values (y,26557003);

sed你已经有了第一个论点。第二个简单地找到由以下组成的第一个字符串:

  • 字符串"values ("
  • 零个或多个非逗号字符(贪婪匹配,尽可能多);和
  • 一个逗号。

然后它替换了"values ("有效地摆脱了值的第一个参数的那个。

于 2012-10-30T04:45:04.020 回答
2

这是使用sed. 它找到一个左括号,然后[^,]多次匹配所有非逗号 ( ) 的内容,然后是一个逗号。并用左括号替换这个匹配:

sed 's/([^,]*,/(/g' file.txt

结果:

insert into table_name    (params2,params3)  values ('x',23547003);
insert into table_name    (params2,params3)  values ('y',26557003);
于 2012-10-30T04:51:20.403 回答
1

sed 解决方案仅在第一个参数称为 params1 时才有效。如果它改变了,你就会崩溃……我建议改用 awk。awk 对这些东西很感兴趣。您可以像这样拆分列:

猫文件 | awk '{print $n}' (其中 n 是字段编号,例如 1、2 3 等)

那么您可以根据需要使用 sed,但我建议您使用它来拆分逗号分隔的 val:

for i in `cat file`; do
  thing=echo $i
  old=$(echo $thing | awk '{print $4}') #This should get you (43044,'x',23547003)
  new=$(echo "\($(echo $old | cut -d \, -f 2)\,$(echo $old | cut -d \, -f 3)\)") 

  #then just replace old with new... 
done
于 2012-10-30T05:02:55.657 回答
1

@paxdiablo 的答案是完全正确的,但是如果任何insert行修改了除table_name. 如果发生这种情况,您可以考虑使用如下所示的小型 sed 脚本:

# fixup.sed
/^insert into table_name/{
    s/params1,//
    s/values ([^,]*,/values (/
}

在上面,这两个s///命令只在以 . 开头的行上执行insert into table_name。像这样应用这个脚本:

$ sed -f fixup.sed < input > output
于 2012-10-30T06:30:18.093 回答
1

Sed 解决方案很好,但相当脆弱(考虑在和下一个逗号之间有换行符的情况values。)尝试m4

m4 -D "table_name=\`table_name'( shift( \$* ))" \
   -D "values=\`values'( shift( \$* ))" input-file
于 2012-10-30T20:18:39.640 回答