Quitar todas las vocales excepto la primera de un conjunto de cuerdas

Quitar todas las vocales excepto la primera de un conjunto de cuerdas

Tengo una cadena compuesta por varias subcadenas, separadas por guiones bajos. Por ejemplo: AbcdAEfd_hEgdgE_AbAAAAA. Necesito eliminar todas las vocales excepto la primera de cada subcadena. Entonces:

  • AbcdAEfd->Abcdfd
  • hEgdgE->hEgdg
  • AbAAAAA->Ab

La cadena resultante debe serAbcdfd_hEgdg_Ab

Respuesta1

Solución bash pura, usando solo sustitución de parámetros:

#! /bin/bash
suffix=${1#*[aeiou]}
prefix=${1%$suffix}
vowel=${prefix: -1}
prefix=${prefix%?}                  # Remove the vowel from the prefix
suffix=${suffix//[aeiou]/}          # Remove the vowels.
echo "$1 -> $prefix$vowel$suffix."

Respuesta2

Puedes usar perl'smirada hacia atrás de ancho cerosintaxis de expresiones regulares.

perl -pe "s/(?<=[aeiou])([^aeiou_]*)[aeiou]([^aeiou_]*)/\1\2/ig"

El siguiente fragmento trata una línea de entrada como una sola cadena (no varias subcadenas).

perl -pe "s/(?<=[aeiou])([^aeiou]*)[aeiou]/\1/ig"

Respuesta3

¿Pitón cuenta? Esto debería funcionar:

cat anonymous.txt | python -c "import sys; x=sys.stdin.read(); print(x[0]+''.join([z for z in x[1:] if z not in 'AEIOUaeiou']))"

También probé con tee y tuberías con nombre, pero falló un poco:

makefifo pipe; cat anonymous.txt | tee >(cut -b1 >> pipe&) >(cut -b1- | tr -d aeiouAEIOU >> pipe&) > /dev/null; cat pipe | xargs -d '\n'

Respuesta4

Esto podría funcionar para usted (GNU sed):

sed 's/^/\n/;ta;:a;s/\n$//;t;s/\n\([^aeiou_]*[aeiou]\)/\1\n/i;:b;s/\n\([^aeiou_]*\)[aeiou]/\1\n/i;tb;s/\n\([^aeiou]*\)/\1\n/i;ta' file

información relacionada