我试图在正则表达式中混合两个条件并没有成功...
当该行包含三个条件时,我想删除一个,
:
-以,
开头
-在第二个逗号处包含,,,
-在该行中总计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'
答案 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。