文字列のセットから最初の母音以外のすべての母音を削除する

文字列のセットから最初の母音以外のすべての母音を削除する

アンダースコアで区切られた複数の部分文字列で構成された文字列があります。例: AbcdAEfd_hEgdgE_AbAAAAA。各部分文字列から最初の母音を除くすべての母音を削除する必要があります。つまり、

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

結果の文字列は次のようになりますAbcdfd_hEgdg_Ab

答え1

パラメータ置換のみを使用する純粋な bash ソリューション:

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

答え2

perl'sを使うことができますゼロ幅後読み正規表現の構文。

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

次のスニペットは、入力行を単一の文字列(複数のサブ文字列ではない)として扱います。

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

答え3

Python はカウントされますか? これは動作するはずです:

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

ティーと名前付きパイプも試してみましたが、失敗しました:

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

答え4

これはうまくいくかもしれません (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

関連情報