2 votes

Comment faire correspondre des chaînes dont les caractères sont répétés un certain nombre de fois dans une plage ?

J'ai besoin de substituer toutes les chaînes de caractères composées de 2 à 5 caractères répétés.

Existe-t-il une expression plus compacte que celle-ci

$ echo a aa aaa aaaa aaaaa aaaaaa| sed 's/a\{2\}/word/;s/a\{3\}/word/;s/a\{4\}/word/;s/a\{5\}/word/;' 
a word word word word aaaaaa

Par exemple, en donnant à la gamme l'équerre courbe (ne fonctionne pas). \{2|3|4|5\}

4voto

heemayl Points 85741

Faites :

sed -E 's/\b([[:alpha:]])\1{1,4}\b/word/g'
  • \b correspond à la limite du mot

  • ([[:alpha:]]) correspond à n'importe quel caractère alphabétique dans la locale actuelle, et le place comme groupe capturé 1

  • \1{1,4} fait correspondre le groupe capturé de 1 à 4 fois, c'est-à-dire qu'au total, le caractère est mis en correspondance de 2 à 5 fois.

  • en cas de correspondance, le mot est remplacé par une chaîne de caractères word

  • le site g modificateur de substitution ( s ) remplacent toutes ces occurrences de mots

Pour faire correspondre n'importe quel caractère, pas seulement alphabétique, remplacez [[:alpha:]] con . :

sed -E 's/\b(.)\1{1,4}\b/word/g'

Beispiel:

$ echo 'a aa aaa aaaa aaaaa aaaaaa' | sed -E 's/\b([[:alpha:]])\1{1,4}\b/word/g'
a word word word word aaaaaa

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X