如何用红色或蓝色打印单词中的第二个元音。假设我执行名为“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]
匹配所需的第二个元音