Regex & Sed: я хотел бы заменить строку с тремя условиями И - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь смешать два условия И в регулярных выражениях без успеха ...

Я хотел бы удалить ,, если строка содержит три условия:
- начинается с ,
- содержит ,,, во второй запятой
- подсчитать 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 голосов
/ 15 января 2019
$ 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

Это будет работать с любым sed, который поддерживает -E для ERE, например GNU sed или OSX / BSD sed.

0 голосов
/ 12 января 2019

Это может сработать для вас (GNU sed):

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

Удалите второе ,, если строка начинается с ,, а за вторым , следует ,,, и есть и есть только пять , по всей строке.

0 голосов
/ 12 января 2019

Это лучше всего достигается с помощью awk:

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

Это работает, потому что 9 запятых подразумевают 10 полей, начальная запятая - это пустое поле, и то же самое верно для полей 3 и 4 (,,,).

Это произойдет только в том случае, если поле 2 пусто.

При использовании конкатенации пустых полей вы можете уменьшить приведенное выше значение до решения анубхавы

0 голосов
/ 12 января 2019

Небольшое изменение в вашем коде сделает:

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
0 голосов
/ 12 января 2019

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
...