代码之家  ›  专栏  ›  技术社区  ›  ΩlostA

Regex&Sed:我想用三个条件替换字符串,并且

  •  1
  • ΩlostA  · 技术社区  · 6 年前

    我试着混合两种条件,在一个正则表达式中没有成功…

    我想去掉一个 , 当行包含三个条件时:
    -从A开始 ,
    -包含 ,,, 在第二个逗号处
    计数 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 回复  |  直到 6 年前
        1
  •  1
  •   kvantour    6 年前

    这是最好的实现与awk:

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

    这是因为9个逗号意味着10个字段,起始逗号是一个空字段,字段3和4(,,,,)也同样适用。

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

    当使用空字段的串联时,可以将上面的内容减少到 solution of anubhava

        2
  •  5
  •   anubhava    6 年前

    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
    
        3
  •  1
  •   Tyl    6 年前

    对代码的小改动可以做到:

    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
    
        4
  •  0
  •   potong    6 年前

    这可能适用于您(GNU SED):

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

    删除第二个 , 如果行以 , 第二 , 其次是 ,, 而且只有五个 , 在整条线上。

        5
  •  0
  •   Ed Morton    6 年前
    $ 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
    

    这将与任何支持 -E 对于ERE,例如GNU SED或OSX/BSD SED。