我有一个包含
等行的文件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);
答案 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