如何按照给定的字母数显示单词?

时间:2017-03-17 10:13:14

标签: regex linux bash awk sed

我创建了这个基本脚本:

#!/bin/bash

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

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

在这里,它应该只打印2个字母的单词,但是这样可以提供不同的输出

有人可以提出如何使用sed或使用awk来实现这一目标的想法吗?

6 个答案:

答案 0 :(得分:4)

  

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

您的sed命令只是在文本中搜索2行。

您可以使用awk

awk 'length() == 2' file

或者使用shell变量:

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

答案 1 :(得分:3)

您正在执行的是:

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 :(得分:2)

Pure 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。如果没有args,printf仅打印所需长度的填充空格,例如:2
  • 但我们有一个变量var,因此%${var}s
  • 使用.
  • 替换字符串中的所有空格

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

file="/usr/share/dict/words"
var=5

grep -P "^\w{$var}$" "$file"

答案 3 :(得分:1)

尝试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

具有相同的效果。

答案 4 :(得分:1)

仅输出与grep:

匹配2个字母字符的行
grep '^[[:alpha:]]\{2\}$' /usr/share/dict/words

答案 5 :(得分:0)

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

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

FS分隔自己字段中的每个字符,以便NF告诉记录长度。