sed或awk - 删除模式之间的字符串

时间:2011-06-16 13:29:18

标签: sed awk replace

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

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3
...

有些行有一个标识符(如AAA);有些人有两个人(比如CCC);有些人有三个或更多(如EEE)。有些标识符不是三个字符。我需要从行的每一行中删除除第一个标识符之外的所有标识符(这样第一个句点和它之后的任何内容都会被删除,直到遇到第一个逗号),产生这个:

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH,H-name,num1,num2,num3
...

我尝试了一些模式替换方法但是我被绊倒了。有没有人有我需要的语法?

3 个答案:

答案 0 :(得分:2)

sed 's/^\([^.]\{1,\}\)[^,]*/\1/'

答案 1 :(得分:2)

删除点和第一个冒号之间的所有内容。对于文件

$ cat foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3

使用此sed命令:

$ sed 's/\.[^,]*//' foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3    
HHH,num1,num2,num3

但是,它会在最后一行删除H。然而,这似乎是你的例子中的一个错字。

答案 2 :(得分:1)

使用perl

$ perl -pe 's/\.[A-Z.]*?,/,/' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3

SED

$ sed 's/\.[A-Z.]*,/,/' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3

和awk

$ awk '/\./{sub(/\.[A-Z.]*,/, ",", $0)}{print}' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3