如何打印只包含BASH列表中字符的行?

时间:2014-05-19 14:32:48

标签: regex bash grep

我有一个名为“dictionary.txt”的文件,其中包含所有可能单词的列表,例如:

a
aardvark
act
anvil
ate
...

如何搜索此内容,仅打印包含有限列表中字母的行,例如,如果列表中包含字母“c”,“a”和“t”,则搜索将显示以下字词:

a
act
cat

如果搜索字母“e”,“a”和“t”,则只能从“dictionary.txt”找到这些单词:

a
ate
eat
tea

我管理的唯一解决方案是:

  • 创建所有可能的字母列表。
  • 从此列表中删除搜索到的字母,留下我不想搜索的字母列表。
  • 使用for循环循环每个字母,删除字典中包含这些字母的所有行。
  • 打印字典中的其余字词。

此解决方案非常慢。此外,我需要将此代码与其他语言一起使用,这些语言有数千个可能的字符,因此这种搜索方法特别慢。

如何只打印“dictionary.txt”中仅包含搜索字母的那些行,而不打印其他内容?

5 个答案:

答案 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