2015-07-10 55 views
1

我有一个简单的sed问题。sed:删除数字后的数字

我的数据是这样的:

2600,Sale,"Approved 911973",244.72 
2601,Sale,"Approved 04735C",490.51 
2602,Sale,"Approved 581068",52.82 
2603,Sale,"Approved 009275",88.10 

如何使这样的:

2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 

通知后的数字批准都不见了以及报价。我可以删除引号:

sed 's/,$//gn' file 

但我不知道如何删除空格和数字。

谢谢!

+0

限制此条款仅适用于您所引用的专栏并应用sed's/[0-9] * // g' – SriniV

回答

1
sed "s/\"Approved[^,]*/Approved/g" 

它发现引用了“批准”,其次是任何非逗号字符,直到第一个逗号遇到,并与已批准(不包括引号)替换它

2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 
+0

谢谢!这很有效,因为我也可以替换文件中的其他内容。最后做的是什么? –

+1

非常好,很高兴我能帮到你! '*'匹配前面任何一个表达式,它是任何不是逗号的字符。因此,它能够匹配Approved,后面跟随任意数量的非逗号字符,包括空格,数字和结尾引用,并且具有非贪婪的正确性属性,因此它将尽可能匹配并且不会更多 - 将其与'Approved。*,'可以匹配这个CSV格式的其他几个字段,这当然不是你想要的! – Alejandro

1

使用扩展的正则表达式与sed

sed -r 's/"([^[:space:]]*)[^"]*"/\1/g' file 

以上正则表达式针对任何带引号的字符串。如果你想指定的字符串Approved,则:

sed -r 's/"(Approved)[^"]*"/\1/g' file 

有了基本的正则表达式:

sed 's/"\(Approved\)[^"]*"/\1/g' file 

针对任何引用字符串,用awk(仅当改变Approved[^[:space:]]*

1

的一种方式其他列不包含您的示例中的多个单词):

awk -F"[ ,]" '{gsub("\"","");$1=$1}1' OFS=, file 
1
awk -F'[," ]' '{OFS=","; print $1,$2,$4,$7}' file 

输出:

 
2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 

我想没有其他空格。