用红色打印单词中的第二个元音

用红色打印单词中的第二个元音

如何用红色或蓝色打印单词中的第二个元音。假设我执行名为“script1”的脚本,该脚本读取一个文本文件。我的脚本应该能够用红色或蓝色打印每个单词中的第二个元音。如果只有一个元音,则用彩色打印。如果没有元音,则用彩色打印单词中的第一个字母!

答案1

#!/bin/bash

filename="./file" # change this filename according to your requirements
red=$'\e[31m'
reset=$'\e[0m'

# read single line from $filename in $line (see last "done", last line of code)
while read -r line; do 

  # loop over every single word in $line
  for word in $line; do
    vc=$(tr -cd '[aeiouAEIOU]' <<< "$word") # remove all but vowels

    case ${#vc} in                          # ${#vc}: number of vowels
      0)                                    # no vowel
        sed -E "s/^./${red}&${reset}/" <<< "$word"
        ;;
      1)                                    # one vowel
        sed -E "s/^([^aeiou]*)([aeiou]+)(.*)$/\1${red}\2${reset}\3/i" <<< "$word"
        ;;
      *)                                    # two or more vowels
        sed -E "s/^([^aeiou]*[aeiou][^aeiou]*)([aeiou])(.*)$/\1${red}\2${reset}\3/i" <<< "$word"
        ;;
    esac

  done | tr "\n" " "
  echo
done < "$filename"

缺点:输出中会丢失连续的空格和制表符。


更多信息:help <command>man <command>info <command>

答案2

如何使用 grep 来为匹配项着色,以及一些 PCRE-fu?例如

grep --color=always -iP '\b[^aeiou\s]*[aeiou][^aeiou\s]*\K[aeiou]'

在哪里

  • \b匹配单词边界;然后
  • [^aeiou\s]*匹配零个或多个非元音、非空格字符
  • [aeiou]匹配第一个元音
  • [^aeiou\s]*匹配另外零个或多个非元音、非空格字符
  • \K从最终匹配的表达式中排除上述所有内容(实际上,可变长度后视断言
  • 最后,[aeiou]匹配所需的第二个元音

在此处输入图片描述

相关内容