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 perl
verwendenLook-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