3 votes

bash comment supprimer sélectivement les espaces dans une chaîne de caractères

Existe-t-il un moyen de supprimer sélectivement les espaces dans une chaîne, en bash ? Par exemple

hello world 
hello world   
hello world    
    hello world

et la sortie :

hello world
hello world

Remarquez que je veux préserver les espaces entre les mots anglais ou simplement l'alphabet anglais, mais pas les autres.

Je comprends python.re est probablement bon pour cela, mais je préfère une commande bash si possible.

4voto

Tranbi Points 581

Vous pouvez utiliser sed :

echo hello world  | sed -E "s/([^a-zA-Z]) ([^a-zA-Z])/\1\2/g"
  • ([^a-zA-Z]) ([^a-zA-Z]) est une expression régulière correspondant à un espace entre deux caractères non latins ( ^ nie). Les caractères précédents et suivants sont saisis en groupes (#1 et #2)
  • \1\2 est la chaîne de remplacement (uniquement les groupes sans espace entre eux).

Sortie :

hello world

Note : pour remplacer les espaces de début et de fin, votre expression doit être :

(^|[^a-zA-Z]) ([^a-zA-Z]|$)

Edit : Une chose que je n'ai pas prise en compte est que ce type d'expression consomme les caractères avant et après les espaces. Donc dans le cas hello world il restait encore un espace blanc. Vous devez alors utiliser un moteur regex qui prend en charge les palliatifs :

echo "     hello world, !"  | perl -pe "s/(?<=^|[^[:ascii:]]) | (?=[^[:ascii:]]|$)//g"

Sortie :

hello world

Afin de supprimer les espaces entre les caractères latins/kandji, j'ai divisé l'expression en deux. J'ai également remplacé la condition sur le caractère latin par ascii. Cela devrait donner des résultats plus appropriés

1voto

Shawn Points 13289

A perl à l'aide des propriétés Unicode (en particulier, si un caractère est ou n'est pas dans le fichier latin script :

$ perl -CSD -lpe 's/^\s+//; # Remove leading spaces
                  s/\s+$//; # Remove trailing spaces
                  # Remove spaces between two non-latin characters.
                  s/(\P{scx=Latin})\s++(?=\P{scx=Latin})/$1/g; 
                  # Remove spaces between a leading latin and trailing non-latin
                  s/(\p{scx=Latin})\s++(?=\P{scx=Latin})/$1/g;
                  # Remove spaces between a leading non-latin and trailing latin
                  s/(\P{scx=Latin})\s++(?=\p{scx=Latin})/$1/g;' input.txt
hello world
hello world
hello world
hello world

Il effectue un certain nombre de substitutions pour les différents cas où vous souhaitez supprimer les espaces, au lieu d'essayer d'utiliser une seule expression régulière pour répondre à toutes les possibilités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X