2 votes

Comment puis-je faire correspondre une chaîne de caractères contenant des caractères répétés un certain nombre de fois dans une plage donnée ?

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

Y a-t-il une expression plus compacte que celle-ci

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

Par exemple en donnant la plage entre les crochets courbés (ce qui ne fonctionne pas) \{2|3|4|5\}

4voto

heemayl Points 85741

Faire :

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

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

  • \1{1,4} correspond au groupe capturé 1 répété de 1 à 4 fois, c'est-à-dire au total, le caractère est recherché 2 à 5 fois

  • si une correspondance est trouvée, le mot est remplacé par la chaîne word

  • le modificateur g de la substitution (s) remplace toutes ces occurrences de mots

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

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

Exemple :

$ 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