正则表达式和Sed:我想用三个条件替换一个字符串,并且

时间:2019-01-12 15:14:14

标签: regex sed replace terminal command-line-interface

我试图在正则表达式中混合两个条件并没有成功...

当该行包含三个条件时,我想删除一个,
-以,
开头 -在第二个逗号处包含,,,
-在该行中总计9个逗号

要更改的行示例:

=> ,BRQSSQDFACKE JURFSDFGEN,,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGIË,NL
=> SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR   

行更改的结果:

=> ,BRQSSQDFACKE JURFSDFGEN,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGIË,NL
=> SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR

我尝试过,但是还不完整...

sed '/^\([^,]*,\)\{9\}[^,]*$/s/,//2'

5 个答案:

答案 0 :(得分:5)

awk由于用逗号分隔的输入中有多个条件,因此更适合此作业。

您可以使用:

awk -F, 'NF == 10 && $1 $3 $4 == "" {sub(/,,,/, ",,")} 1' file

,BRQSSQDFACKE JURFSDFGEN,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGIË,NL
SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR

答案 1 :(得分:1)

这是用awk最好的实现:

awk -F, '(NF==10) && ($1=="") && ($3=="") && ($4=="") { sub(/,,,/,",,",$0)}1'

之所以可行,是因为9个逗号表示10个字段,起始逗号是一个空字段,并且字段3和4(,,,)保持不变。

仅当字段2为空时,此操作才会失败。

使用空字段的串联时,可以将以上内容简化为solution of anubhava

答案 2 :(得分:1)

只需对您的代码进行少许更改即可

sed '/^,\([^,]*,\)\{8\}[^,]*$/s/,//3'

例如:

$ cat file
,BRQSSQDFACKE JURFSDFGEN,,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGI?,NL
SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR

$ sed '/^,\([^,]*,\)\{8\}[^,]*$/s/,//3' file
,BRQSSQDFACKE JURFSDFGEN,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGI?,NL
SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed -r 's/^(,[^,]*),(,,([^,]*,[^,]*){5})$/\1\2/' file

如果该行以,开头并且第二个,之后是,,则删除第二个,,,并且还有另外五个{{1 }}贯穿整行。

答案 4 :(得分:0)

$ sed -E 's/^(,[^,]*,,),(([^,]*,){5}[^,]*)$/\1\2/' file
,BRQSSQDFACKE JURFSDFGEN,,Vitsasdfaan, 11,9660,LOCHRISTI,BELGIË,NL
SCURTUSDF,Daniqsdel,Mr.,Tombqsdqfsdferg, Rodqsdfqsfqst, 17,4000,SANKT VITH,BELGIQUE,FR

这将适用于支持ERE的-E的任何sed,例如GNU或OSX / BSD。