Retirar todas as vogais, mas a primeira de um conjunto de cordas

2

Eu tenho uma string composta de várias substrings, separadas por sublinhados. Por exemplo: AbcdAEfd_hEgdgE_AbAAAAA . Eu preciso remover todas as vogais, exceto a primeira de cada substring. Então:

  • AbcdAEfd - > %código%
  • Abcdfd - > %código%
  • hEgdgE - > %código%

A string resultante deve ser hEgdg

    
por newuser 04.07.2012 / 09:33

4 respostas

4

Solução pura do bash, usando apenas a substituição 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."
    
por 04.07.2012 / 11:10
1

Você pode usar a sintaxe de regex <-href="http://www.perlmonks.org/?node_id=518444"> look-behind da perl .

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

Este próximo trecho trata uma linha de entrada como uma única string (não várias sub-strings).

perl -pe "s/(?<=[aeiou])([^aeiou]*)[aeiou]//ig"
    
por 04.07.2012 / 11:02
0

O python conta? Isso deve 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']))"

Eu tentei com tee e named pipes também, mas meio que falhei:

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

Isso pode funcionar para você (GNU sed):

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