← Back to team overview

sslug-teknik team mailing list archive

sed-regexp bøvl med at gentage søg-erstat i en linje

 

Jeg havde en korrupt /etc/group fil i dag, som havde været igennem en margen-justering, dvs. flere korte linjer var rykket sammen på en så de omtrent var 80 tegn i bredden. Således:

daemon:x:2:root,bin,daemon,cyrus,bacula sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon tty:x:5: disk:x:6:root lp:x:7:daemon,lp mem:x:8:

Til det formål forsøgte jeg at få sed til at hjælpe med følgende regexp-besværgelse:
sed -re 's/([a-z0-9]+:x:[0-9]+:[a-z0-9,]*)( )([#a-z0-9]+)/\1\n\3/g'

Til min overraskelse giver det resultatet:

daemon:x:2:root,bin,daemon,cyrus,bacula
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5: disk:x:6:root
lp:x:7:daemon,lp mem:x:8:

-altså linje 2 i input bliver til 3 linjer á 1 hhv. 2 grupper i output.
Hvorfor ikke 5 linjer á 1 gruppe, som tilsigtet - og når det nu ikke funker, hvorfor så heller ikke 4 linjer á hhv. 1 og 4 grupper (som jeg ville synes var mere logisk).

Jeg har forstået at /g optionen til s/ funktionen gør at alle tilfælde af søgemønsteret i linjen skulle matches, men er der noget med at man skal nulstille en token-tæller eller noget i den dur?

Mvh
Kenneth


Follow ups