我创建了这个基本脚本:
#!/bin/bash
file="/usr/share/dict/words"
var=2
sed -n "/^$var$/p" /usr/share/dict/words
但是,它不能按要求工作(或者仍然需要更多逻辑)。
在这里,它应该只打印2个字母的单词,但是这样可以提供不同的输出
有人可以提出如何使用sed或使用awk来实现这一目标的想法吗?
答案 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
告诉记录长度。