我有一个名为"dictionary.txt"的文件,其中包含所有可能单词的列表,例如:
a
aardvark
act
anvil
ate
...
Run Code Online (Sandbox Code Playgroud)
如何搜索此内容,仅打印包含有限列表中字母的行,例如,如果列表中包含字母"c","a"和"t",搜索将显示以下单词:
a
act
cat
Run Code Online (Sandbox Code Playgroud)
如果搜索字母"e","a"和"t",则只能从"dictionary.txt"中找到这些单词:
a
ate
eat
tea
Run Code Online (Sandbox Code Playgroud)
我管理的唯一解决方案是:
这个解决方案非常慢.此外,我需要将此代码与其他语言一起使用,这些语言有数千个可能的字符,因此这种搜索方法特别慢.
如何仅打印"dictionary.txt"中仅包含搜索字母的那些行,而不打印其他内容?
amp*_*ine 18
grep '^[eat]*$' dictionary.txt
Run Code Online (Sandbox Code Playgroud)
说明:
^
=标记表示行的开头
$
=标记表示行尾
[abc]
=字符类("匹配这些字符中的任何一个")
*
=字符类的乘数(零次或多次重复)
不幸的是,我不能评论,否则我会加入amphetamachine的答案.无论如何,随着数千个搜索字符的更新条件,您可能需要执行以下操作:
grep -f patterns.txt dictionary.txt
Run Code Online (Sandbox Code Playgroud)
patterns.txt
你的正则表达式在哪里:
/^[eat]\+$/
Run Code Online (Sandbox Code Playgroud)
以下是示例会话:
$ 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
$
Run Code Online (Sandbox Code Playgroud)
这样你就不受shell的限制(Argument list太长).此外,您可以在文件中指定多个模式:
$ cat patterns.txt
^[eat]\+$
^five$
$ grep -f patterns.txt dictionary.txt
eat
tea
five
$
Run Code Online (Sandbox Code Playgroud)
尝试使用awk
:
awk '/^[eat]*$/ { print }' dictionary.txt
Run Code Online (Sandbox Code Playgroud)
我发现这比grep快了至少一个数量级超过7个字母.但是,我不知道你是否会遇到成千上万个字母的问题,因为我没有测试那么多.
您甚至可以一次搜索多个模式(这比一次搜索每个模式更快,因为字典文件只能读取一次).每个模式都充当if语句:
awk '/^[eat]*$/ { print "[eat]: " $0 } /^[cat]*$/ { print "[cat]: " $0 }' dictionary.txt
Run Code Online (Sandbox Code Playgroud)
小智 5
sed -n '/a/'p words.txt
Run Code Online (Sandbox Code Playgroud)
将此用于您需要找到的任何字母.如果要一起查找多个字母,只需重复该命令即可.
恕我直言也不应该用于最简单/最基本的搜索,恕我直言.虽然我通常会毫不犹豫地将任何POSIX实用程序称为过时,但我确实试图避免使用grep.它的语法非常不一致.
还建议学习此文本文件.http://sed.sourceforge.net/sed1line.txt