从一组字符串中去除除第一个元音之外的所有元音

从一组字符串中去除除第一个元音之外的所有元音

我有一个由多个子字符串组成的字符串,用下划线分隔。例如: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零宽度后视正则表达式语法。

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

我也尝试过使用 tee 和命名管道,但有点失败:

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

相关内容