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

Vil*_*age 8 regex bash grep

我有一个名为"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)

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

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

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

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

amp*_*ine 18

grep '^[eat]*$' dictionary.txt
Run Code Online (Sandbox Code Playgroud)

说明:

^ =标记表示行的开头

$ =标记表示行尾

[abc] =字符类("匹配这些字符中的任何一个")

* =字符类的乘数(零次或多次重复)

  • 这也适用于空行.最好用`\ +'或`+`代替`*`. (3认同)

gal*_*axy 9

不幸的是,我不能评论,否则我会加入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)


sav*_*nto 6

尝试使用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