从行中删除一个数字,同时保持其他所有相同

时间:2012-10-30 04:38:21

标签: regex unix sed gnu

我有一个包含

等行的文件
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,但如何在值后删除数字?

铊组成; dr

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

5 个答案:

答案 0 :(得分: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 ("替换它,它有效地摆脱了值的第一个参数。

答案 1 :(得分: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);

答案 2 :(得分:1)

sed解决方案仅在第一个param被称为params1时才有效。如果它改变了,你就会破坏......我建议改用awk。 Awk摸索着这些东西。您可以像这样拆分列:

cat file | awk'{print $ n}'(其中n是字段编号,如1,2 3等)

然后如果你愿意,你可以sed,但我建议你用它来分割逗号分隔的vals:

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

答案 3 :(得分: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

答案 4 :(得分:1)

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

m4 -D "table_name=\`table_name'( shift( \$* ))" \
   -D "values=\`values'( shift( \$* ))" input-file