我已经创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
告诉记录的长度。