0

ランダムな順序で3つの数字7を含む名前を見つける必要があります。

私の試み

7つを含まない名を見つける必要があります

ls | grep [^7]

次に、これらの一致をスペース全体から削除できます

ls [remove] ls | grep [^7]

私の擬似コードの問題はすぐに繰り返され始めます。

AWK / Python / Bashでランダムな順序で3つの7を含む名前をどのように見つけることができますか?

[編集] 名前には任意の数の文字を含めることができ、3つの7の単語を含めることができます。

4

5 に答える 5

7

「ランダムオーダー」の部分がわかりません。同じトークンが繰り返される場合、「順序」をどのように区別しますか?「a7b7」は「c7d7」と7の順で違いますか?

とにかく、これはうまくいくはずです:

 ls *7*7*7*

シェルで問題を解決しましょうが、正しく理解できなかったのかもしれません。

編集:上記は間違っています、それは望まれない4つ以上の7の場合を含みます。これがbashであり、拡張グロブが有効になっていると仮定すると、これは機能します。

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

これは、「7以外の0個以上の文字、7個、7個以外の0個以上の文字」などと読み替えられます。ここでのアスタリスクはプレフィックス演算子であり、([^7])「7以外の任意の文字」を意味する式を操作することを理解することが重要です。

于 2009-03-12T15:15:27.567 に答える
5

ちょうど 3 つの 7 を含み、それ以上は含まないファイルを探していると思います。extends regexp スイッチ ( -E) を指定して gnu grep を使用する:


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

トリックを行う必要があります。

基本的に、これは「not 7 の後に 7」が 3 回出現し、次に文字列全体で一連の「not 7」が一致します (それぞれパターンの先頭と末尾にある ^ と $)。

于 2009-03-12T15:35:32.110 に答える
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 に答える
2

このようなもの:

printf '%s\n' *|awk -F7 NF==4
于 2009-03-12T16:31:29.433 に答える
1

または、単一の grep で実行する代わりに、1 つの grep を使用して 3 つ以上の 7 を含むファイルを検索し、別の grep を使用して 4 つ以上の 7 を除外します。

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

作業の一部を短いシェル グロブに移動できます。

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

ただし、そのパターンに一致するファイルが多数ある場合、glob サイズに組み込みの制限があるため、後者は機能しません。

「ls」の「-f」は、「ls」が結果をソートしないようにするためのものです。ディレクトリに膨大な数のファイルがある場合、ソート時間が非常に長くなる可能性があります。

この 2 段階のフィルター プロセスは、[^7] パターンを使用するよりも理解しやすいと思います。

また、オプションとしてそれを要求したため、Python スクリプトとしてのソリューションを次に示します。

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

これは、改行文字を含む (悪意のある) ファイル名のように、シェル コマンドが処理しないいくつかのケースを処理します。ここでも、その場合の出力はまだ間違っているか、少なくとも下流のプログラムによって準備されていない可能性があります。

于 2009-03-12T16:39:21.427 に答える