Напечатайте второй гласный в слове красным цветом
Как напечатать второй гласный в слове красным или синим цветом. Допустим, я выполняю свой скрипт с именем "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]
соответствовать желаемой второй гласной