如何根据给定数量的字母显示单词?

我已经创build了这个基本的脚本:

#!/bin/bash file="/usr/share/dict/words" var=2 sed -n "/^$var$/p" /usr/share/dict/words 

但是,它不是按要求工作(或者仍然需要更多的逻辑)。

在这里,它应该只打印2个字母的单词,但是这是给出不同的输出

任何人都可以提出如何实现这个与sed或awk的想法?

你正在执行的是:

 sed -n "/^2$/p" /usr/share/dict/words 

这意味着:所有包含数字2的行,没有别的。 当然,这不会返回任何东西,因为/usr/share/dict/words有词,而不是数字(据我所知)。

如果你想打印由两个字符组成的行,你需要使用类似.. (因为.匹配任何字符):

 sed -n "/^..$/p" /usr/share/dict/words 

为了使字符数变化,请使用类似{}的量词(注意\的用法使sed的BRE理解正确):

 sed -n "/^.\{2\}$/p" /usr/share/dict/words 

或者,用一个变量:

 sed -n '/^.\{'"$var"'\}$/p' /usr/share/dict/words 

请注意,我们把这个变量放在安全报价之外(感谢Ed Morton在提醒的评论中)。

它应该只打印2个字母的单词

你的sed命令只是在文本中搜索带有2行。

你可以使用awk来实现这个功能:

 awk 'length() == 2' file 

或者使用一个shell变量:

 awk -vn=$var 'length() == n' file 

纯粹的bash … 🙂

 file="/usr/share/dict/words" var=2 #building a regex str=$(printf "%${var}s") re="^${str// /.}$" while read -r word do [[ "$word" =~ $re ]] && echo "$word" done < "$file" 

它建立一个正则表达式在^..$ (点的数目是可变的)。 所以分两步进行:

  • 创建所需长度的字符串,例如: %2s 。 没有参数, printf仅打印所需长度的填充空间,例如: 2
  • 但是我们有一个变量var ,所以%${var}s
  • 替换字符串中的所有空格.

但不要使用这个解决方案。 这太慢了,这里有更好的工具,最好的是imho grep

 file="/usr/share/dict/words" var=5 grep -P "^\w{$var}$" "$file" 

试试awk

 awk -v var=2 '{if (length($0) == var) print $0}' /usr/share/dict/words 

这可以缩短到

 awk -v var=2 'length($0) == var' /usr/share/dict/words 

具有相同的效果。

要仅输出与grep匹配的两个字母字符的行:

 grep '^[[:alpha:]]\{2\}$' /usr/share/dict/words 

GNU awk和mawk至少(由于空FS ):

 $ awk -F '' 'NF==2' /usr/share/dict/words #| head -5 aa Ab ad ae Ah 

FS分隔每个字符在自己的领域,所以NF告诉记录的长度。