在 grep 中使用 Linux 终端命令行变量

标签 linux variables terminal grep

我想显示恰好有 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/

相关文章:

ruby-on-rails - gem install rails -v 4.1.0 卡在 ri-documentation

python - 以 nohup 启动的进程未与父进程分离

javascript - 从数组中添加数字?

bash - 变量替换(你怎么称呼/命名这个方法)?

使用 jekyll 和 github 页面构建静态站点时可用的变量

linux - 如何使用 PS1 变量在终端提示符中显示时间?

linux - linux 上的 matlab 无法绘制任何东西(无法加载 libstdc++.so.6 : version `CXXABI_1.3.8' not found)

通过 SNMP 监控 Java 应用程序

Perl6 : getc in raw mode

java - 如何使用 JDK 1.8+ 的终端验证 YourKit 代理是否已正确安装在 macOS 上