我有一个名为“dictionary.txt”的文件,其中包含所有可能单词的列表,例如:
a
aardvark
act
anvil
ate
...
如何搜索此内容,仅打印包含有限列表中字母的行,例如,如果列表中包含字母“c”,“a”和“t”,则搜索将显示以下字词:
a
act
cat
如果搜索字母“e”,“a”和“t”,则只能从“dictionary.txt”找到这些单词:
a
ate
eat
tea
我管理的唯一解决方案是:
此解决方案非常慢。此外,我需要将此代码与其他语言一起使用,这些语言有数千个可能的字符,因此这种搜索方法特别慢。
如何只打印“dictionary.txt”中仅包含搜索字母的那些行,而不打印其他内容?
答案 0 :(得分:18)
grep '^[eat]*$' dictionary.txt
说明:
^
=标记表示行的开头
$
=标记表示行尾
[abc]
=字符类(“匹配其中任何一个字符”)
*
=字符类的乘数(零次或多次重复)
答案 1 :(得分:9)
不幸的是,我无法发表评论,否则我会添加amphetamachine's answer。无论如何,随着数千个搜索字符的更新条件,您可能需要执行以下操作:
grep -f patterns.txt dictionary.txt
patterns.txt
是你的正则表达式:
/^[eat]\+$/
以下是示例会话:
$ cat << EOF > dictionary.txt
> one
> two
> cat
> eat
> four
> tea
> five
> cheat
> EOF
$ cat << EOF > patterns.txt
> ^[eat]\+$
> EOF
$ grep -f patterns.txt dictionary.txt
eat
tea
$
这样你不受shell的限制(参数列表太长)。此外,您可以在文件中指定多个模式:
$ cat patterns.txt
^[eat]\+$
^five$
$ grep -f patterns.txt dictionary.txt
eat
tea
five
$
答案 2 :(得分:6)
使用awk
:
awk '/^[eat]*$/ { print }' dictionary.txt
我发现这比grep快了至少一个数量级超过7个字母。但是,我不知道你是否会遇到成千上万个字母的问题,因为我没有测试那么多。
您甚至可以一次搜索多个模式(这比一次搜索每个模式更快,因为字典文件只能读取一次)。每个模式都充当if语句:
awk '/^[eat]*$/ { print "[eat]: " $0 } /^[cat]*$/ { print "[cat]: " $0 }' dictionary.txt
答案 3 :(得分:5)
sed -n '/a/'p words.txt
将此用于您需要找到的任何字母。如果您想要一起找到多个字母,只需重复该命令。
Grep也不应该用于超过最简单/最基本的搜索,恕我直言。虽然我通常会毫不犹豫地将任何POSIX实用程序称为过时,但我确实试图避免使用grep。它&#39;语法非常不一致。
还建议您学习此文本文件。 http://sed.sourceforge.net/sed1line.txt
答案 4 :(得分:1)
如果你想包括例如模式中的变音符号并不想拥有其他重音符号,在执行grep之前设置LC_ALL="C"
。
例如只会在潜在的dictionary.txt文件中为您提供候选德语单词。
LC_ALL="C" grep '^[a-zA-ZäÄöÖüÜß]*$' dictionary.txt