我想显示恰好有 14、15 和 16 个不同字母的单词数量。我想使用 for 循环。 (它必须是一个衬垫。)
这是我目前所拥有的:
我在 {14..16}; do echo "There are $(cat/usr/share/dict/dutch | grep -P '^.{"$i"}$' | grep -vP -c '(.).*\1') 单词$i 个独特的字母";完成
结果:
正好有 14 个不同字母的单词有 0 个
有 0 个单词恰好有 15 个不同的字母
有 0 个单词恰好有 16 个不同的字母
这意味着循环有效,当我这样运行它时:
echo "有 $(cat/usr/share/dict/dutch | grep -P '^.{14}$' | grep -vP -c '(.).*\1') 个单词恰好有 14 个独特的字母"&&
echo “有 $(cat/usr/share/dict/dutch | grep -P '^.{15}$' | grep -vP -c '(.).*\1') 个单词恰好有 15 个不同的字母” &&
echo "There there $(cat/usr/share/dict/dutch | grep -P '^.{16}$' | grep -vP -c '(.).*\1') 个单词恰好有 16 个不同的字母"
结果是:
有 13 个单词恰好有 14 个不同的字母
有 2 个单词恰好有 15 个不同的字母
有 0 个单词恰好有 16 个不同的字母
这表明我对 grep 命令中的变量 ($i) 做错了什么。我不知道我应该怎么做或解决这个问题。
提前致谢
最佳答案
看起来您需要在第一个正则表达式中的变量周围使用单引号而不是双引号:
for i in {14..16}; do
echo "there are $(cat /usr/share/dict/dutch | grep -P '^.{'$i'}$' | grep -vP -c '(.).*\1') words with exactly $i unique letters";
done
因为您的第一个正则表达式用单引号括起来,所以它是按字面意思使用的,没有任何变量扩展。通过将变量放在单引号中,您实际上是在指定两个紧紧围绕实际变量的文字字符串(换句话说,您的变量实际上根本没有用任何引号引起来)。
编辑:这是我在我的系统上得到的:
$ for i in {14..16}; do echo "there are $(cat /usr/share/dict/dutch | grep -P '^.{'$i'}$' | grep -vP -c '(.).*\1') words with exactly $i unique letters"; done
there are 13 words with exactly 14 unique letters
there are 2 words with exactly 15 unique letters
there are 0 words with exactly 16 unique letters
编辑 2:这可能会更清楚地说明问题:
$ i=12
$ echo '^.{"$i"}$'
^.{"$i"}$
$ echo '^.{'$i'}$'
^.{12}$
关于在 grep 中使用 Linux 终端命令行变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45595975/