0

我需要以随机顺序查找包含三个数字 7 的名称。

我的尝试

我们需要找到不包含七个的名字

ls | grep [^7]

然后,我们可以从整个空间中删除这些匹配项

ls [remove] ls | grep [^7]

我的伪代码中的问题开始迅速重复。

如何通过 AWK/Python/Bash 以随机顺序找到包含三个 7 的名称?

[编辑] 该名称可以包含任意数量的字母,并且包含三个 7 的单词。

4

5 回答 5

7

我不明白关于“随机顺序”的部分。当重复的标记相同时,您如何区分“顺序”?“a7b7”与“c7d7”在7s的顺序上是否不同?

无论如何,这应该工作:

 ls *7*7*7*

它只是让shell解决问题,但也许我没有正确理解。

编辑:以上是错误的,它包括不想要的超过四个 7 的情况。假设这是 bash,并且启用了扩展的 globbing,则此方法有效:

ls *([^7])7*([^7])7*([^7])7*([^7])

这读作“零个或多个不是七的字符,然后是一个七,然后是零个或多个不是七的字符”,依此类推。重要的是要理解星号在这里是前缀运算符,对([^7])表示“除 7 之外的任何字符”的表达式进行操作。

于 2009-03-12T15:15:27.567 回答
5

我猜你想找到正好包含三个 7 的文件,但没有更多。将 gnu grep 与扩展正则表达式开关 ( -E) 一起使用:


ls | grep -E '^([^7]*7){3}[^7]*$'

应该做的伎俩。

基本上匹配 3 次出现的“非 7 后跟 7”,然后是整个字符串中的一堆“非 7”(分别位于模式开头和结尾的 ^ 和 $)。

于 2009-03-12T15:35:32.110 回答
2

像这样的东西:

printf '%s\n' *|awk -F7 NF==4
于 2009-03-12T16:31:29.433 回答
2

Perl 解决方案:

$ ls | perl -ne 'print if (tr/7/7/ == 3)'
3777
4777
5777
6777
7077
7177
7277
7377
7477
7577
7677
...

(我碰巧有一个带有 4 位数字的目录。1777 和 2777 不存在。:-)

于 2009-03-12T16:53:43.140 回答
1

或者,不要在单个 grep 中执行此操作,而是使用一个 grep 查找具有 3 个或更多 7 的文件,另一个用于过滤掉 4 个或更多 7 的文件。

ls -f | egrep '7.*7.*7' | grep -v '7.*7.*7.*7'

您可以将一些工作移到较短的 shell glob 中

ls -f *7*7*7* | grep -v '7.*7.*7.*7'

虽然如果有大量文件与该模式匹配,那么后者将无法工作,因为对 glob 大小的内置限制。

'ls' 中的 '-f' 是为了防止 'ls' 对结果进行排序。如果目录中有大量文件,那么排序时间可能会非常明显。

我认为这个两步过滤过程比使用 [^7] 模式更容易理解。

此外,这是作为 Python 脚本的解决方案,因为您要求将其作为选项。

import os
for filename in os.listdir("."):
    if filename.count("7") == 4:
        print filename

这将处理一些 shell 命令不会处理的情况,例如包含换行符的(邪恶)文件名。尽管即使在这里,这种情况下的输出可能仍然是错误的,或者至少下游程序没有准备好。

于 2009-03-12T16:39:21.427 回答