Entfernen aller Vokale außer dem ersten aus einer Zeichenfolge

Entfernen aller Vokale außer dem ersten aus einer Zeichenfolge

Ich habe eine Zeichenfolge, die aus mehreren Teilzeichenfolgen besteht, die durch Unterstriche getrennt sind. Beispiel: AbcdAEfd_hEgdgE_AbAAAAA. Ich muss aus jeder Teilzeichenfolge alle Vokale außer dem ersten entfernen. Also:

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

Die resultierende Zeichenfolge sollte seinAbcdfd_hEgdg_Ab

Antwort1

Reine Bash-Lösung, die nur Parameterersetzung verwendet:

#! /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."

Antwort2

Sie können perlverwendenLook-Behind mit NullbreiteRegex-Syntax.

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

Dieser nächste Codeausschnitt behandelt eine Eingabezeile als einzelne Zeichenfolge (nicht als mehrere Teilzeichenfolgen).

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

Antwort3

Zählt Python? Das hier sollte funktionieren:

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']))"

Ich habe es auch mit T-Stücken und benannten Pipes versucht, aber es ist irgendwie fehlgeschlagen:

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

Antwort4

Dies könnte für Sie funktionieren (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

verwandte Informationen