【问题标题】:Grep words containg 'n' number of letters given user input给定用户输入的包含“n”个字母的Grep单词
【发布时间】:2014-10-10 04:34:41
【问题描述】:

我正在尝试创建一个脚本(bash),它将从用户那里获取输入(整数)并 grep 包含该数量字母的所有单词。我对 grep 的基本工作方式没问题,但我不确定如何使用用户的输入来确定输出

这是我开始的:

#!/bin/sh
echo " Content type: text/html"
echo

x=`expr $1`

我很确定 grep 命令会像 grep^...integer from user$ 一样简单。只是不知道如何使用用户输入。谢谢!

编辑:我应该提到“用户输入”将作为参数输入(./script 6)

【问题讨论】:

  • read variablename??

标签: linux bash shell grep


【解决方案1】:

./script 6 运行此脚本,它将从文件text 中选择所有6 个字母的单词并显示它们:

#!/bin/sh
grep -Eo "\<[[:alpha:]]{$1}\>" text

正则表达式的关键部分:

  • \&lt; 表示单词的开头。

  • [[:alpha:]]{$1} 表示$1 字母字符。如果您希望将撇号(例如 don't)视为有效的单词字符,则将其添加到外部方形后括号中,如下所示:[[:alpha:]']{$1}

  • \&gt; 表示单词的结束。

grep 理解人类语言的能力存在一些限制。例如,在字符串don't 中,它认为撇号是单词边界。

示例

我针对问题的文本运行了这个脚本:

$ ./script.sh 9
basically
determine
mentioned
$ ./script.sh 10
containing

【讨论】:

  • 虽然我不熟悉 [[:alpha:]],但我必须阅读,谢谢!
  • @swam 在过去使用 26 个字母的日子里,字母字符的正则表达式应该是 [a-zA-Z]。随着 UTF8 和字符的现代爆炸以及不再连续的字符排序,需要新的方式来表达需求。 [:alpha:] 表示这个新世界中的字母顺序。关于alpha 和相关类的一些文档是here
【解决方案2】:

您可以使用read 接受用户的输入。

#!/bin/sh
echo $1 | grep ".\{$2\}"

现在如果你把脚本称为./script hello 5

位置参数$1 将是hello$2 作为5

这里 {m} 匹配长度为 m 的行,因为 . 任何字符都精确匹配 m

【讨论】:

  • 我的问题措辞错误。我打算做的是在命令行(./script 6)
  • @nu11p01n73R 但没有锚,它实际上意味着“n 或更多”
  • @o11c {n,} 表示 n 或更多,不带逗号 ,{n} 表示 excat n
  • @nu11p01n73R 但没有-ogrep 仍然输出整行,即使它的一部分在逻辑上是匹配的一部分。
  • @nu11p01n73R 我想我会关注这一点。但是我只想输入一个数字 ./script 6,然后运行一个将产生所有 6 个字母单词的单词列表
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多