Напечатайте второй гласный в слове красным цветом

Как напечатать второй гласный в слове красным или синим цветом. Допустим, я выполняю свой скрипт с именем "script1", который читает текстовый файл. Мой сценарий должен быть способен напечатать второй гласный в каждом слове красным или синим цветом. Если есть только одна гласная, напечатайте это в цвете. Если гласных нет, напечатайте первую букву одним словом в цвете!

2 ответа

Решение
#!/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>

Как насчет использования grep для раскраски спички вместе с PCRE-fu? что-то вроде

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

где

  • \b сопоставить границу слова; затем
  • [^aeiou\s]* соответствовать нулю или большему количеству не гласных, непробельных символов
  • [aeiou] соответствовать первой гласной
  • [^aeiou\s]* соответствует другому нулю или нескольким не гласным, непробельным символам
  • \K чтобы исключить все вышеперечисленное из окончательного сопоставленного выражения (по сути, утверждение с переменной длиной, выглядящее позади)
  • в конце концов, [aeiou] соответствовать желаемой второй гласной

введите описание здесь

Другие вопросы по тегам