【问题标题】:Calculate the number of vowels and consonants in a word计算一个单词中元音和辅音的数量
【发布时间】:2011-08-17 19:29:43
【问题描述】:

我想在 shell 脚本中计算一个单词中元音和辅音的数量,但我不确定如何遍历这个单词。谁能帮我? 我目前拥有的是:

#!/bin/bash

echo 'Give a word'

read word

case $word
in
        a*|e*|i*|o*|u*)
                vowels=&((klinker + 1 ))
        ;;
        *)
                consonants=&((medeklinker + 1 ))
        ;;
esac

echo $vowels
echo $consonants

【问题讨论】:

  • 你在追求什么?一个单词的元音数和辅音数?
  • 是的,没错,但我知道在 c++ 中我如何遍历这个词,但在 unix 中,我不知道母猪如何遍历这个词,这是一个大问题:P跨度>
  • 首先,您必须定义辅音和元音的含义。字母 Y 在 shybyteBryce 等单词中显然是元音,而在 yellow中是半辅音> 和 Yale 以及 boythey 中的半元音。 acre 中的 R 显然是元音,而 little 中的 L 显然是词首的辅音,但词尾是元音。 nth 中的 N 显然是元音,在 eaten 中也是如此。甚至 S 也可以是元音,就像在 psst 中一样。我们来讨论一下cwm这个词,W显然是那个词的元音吗?
  • @tchrist:你能引用“英亩中的 R 是元音”的来源吗,这对我来说显然不是正确的断言(事实上,它是有争议的,对我来说似乎是错误的)。 (请参阅Is 'of course' just a warning that something is not obvious?。)对于 L、N 和 S 的讨论也是如此。(威尔士语)cwm 中的 W 是双 u 字面意思;我同意那里,它充当元音。
  • @Jonathan 鉴于 元音是作为音节中心出现的声音......考虑像 littleacre 这样的 2 音节词。我相信我们会在他们的第一个音节上达成一致。丢弃他们最后的 E,因为无声字母在音节中不起任何作用。 C 和 T 是停止音,不是连续音,因此不能构成音节中心。剩下的只有 R&L 作为它们各自音节的元音。另一个容易推断的例子是class's:撇号总是不发音的,最后的 S 是第二个音节的元音。 Psst 有 1 个音节:P&T 是塞音,只留下 S 作为它的元音。 Qᴇᴅ

标签: unix shell scripting ubuntu


【解决方案1】:

假设你要计算元音和辅音的个数,并且外壳是bash,那么:

word=abstemiously
vowels=$(echo $word | sed 's/[^aeiou]//g')
consonants=$(echo $word | sed 's/[aeiou]//g')

echo "${#word} characters"
echo "${#vowels} vowels"
echo "${#consonants} consonants"

输出:

12 characters
5 vowels
7 consonants

您可以压缩处理,并且可以使用tr 而不是sed。至少在 Bash 4.x 中,shell 中的替换操作可能是可用的,因此您根本不必运行外部程序(例如 trsed)。您还需要考虑标点符号、数字和空格(通常是非字母)会发生什么。同样,有多种方法可以处理此类问题。

【讨论】:

  • 谢谢,我有我之前评论的答案谢谢你的帮助这是完美的答案,知道当我认为合乎逻辑的时候它似乎很明显
  • abstemiously 中的 OU 是表示单个音素的有向图,甚至不是双元音。无论如何,那里只有一个音节。类似地,squeeze 在一个单音节中,其音节中心是由 EE 有向图表示的书写,它是一个单一的声音,因此是一个单一的元音。 U和最后的E都是无声的,完全没有声音的显然不能是元音。虽然这里的 Z 不是元音,但也可以是元音,比如 bzzzt!;原因见上文。
【解决方案2】:
vowels=`echo $word | tr -cd 'aeiou' | wc -c`

【讨论】:

  • 您需要向tr 提供一些输入(尤其是这样用户不必输入两次单词)。此外,使用反引号通常是个坏主意 - 使用 $(tr ... | wc -c) 表示法。
  • 这两种形式的命令替换对我来说都很好.. 差异很小。
  • 如果我需要将目录更改为当前版本的 Perl 的 lib 目录,我绝对更喜欢 cd $(dirname $(dirname $(which perl)))/lib 而不是使用反引号(我什至无法开始输入 MarkDown对于 cmets;在普通外壳中已经够糟糕了)。你需要三个反斜杠。 (使用 % 代替反引号,相当于:cd %dirname \%dirname \\\%which perl\\\%\%%/lib。)没有嵌套,没有太大区别;有了嵌套,差别就很大了!
  • 我知道。你看到这里有嵌套吗? :)
  • 否:但一致性建议将反引号放在“遗留语法”类别中,最好不要让今天从头开始学习 shell 的人使用。
【解决方案3】:

只用 bash:

letters=${word//[^[:alpha:]]/}     # remove all whitespace, punctuation, etc
cnsnnts=${letters//[aeiou]/}       # remove vowels
num_consonents=${#cnsnnts}
num_vowels=$(( ${#letters} - $num_consonents ))

【讨论】:

    【解决方案4】:

    #一个非常简单的计算元音和辅音的程序:

    读单词
    v=`echo $word | tr -cd 'aeiou' | wc -c`
    c=`回声 $word | tr -cd 'bcdfghjklmnpqrstvwxyz' | wc -c`

    回声“元音 = $v”
    echo "辅音 = $c"

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多