Aquí podría ser tu PUBLICIDAD


Nombres de búsqueda imposibles que contienen tres 7s en orden aleatorio por AWK / Python / Bash

votos
0

Necesito encontrar nombres que contengan tres números 7 en orden aleatorio.

Mi intento

Necesitamos encontrar nombres que no contengan siete

ls | grep [^7]

Entonces, podríamos eliminar estas coincidencias de todo el espacio

ls [remove] ls | grep [^7]

El problema en mi pseudo código comienza a repetirse rápidamente.

¿Cómo puede encontrar los nombres que contienen tres 7 en el orden aleatorio de AWK / Python / Bash?

[edit] El nombre puede contener cualquier cantidad de letras y contiene palabras de tres 7s.

Publicado el 12/03/2009 a las 16:11
fuente por usuario Léo Léopold Hertz 준영
En otros idiomas...        العربية       

5 respuestas

votos
7

No entiendo la parte sobre "orden aleatorio". ¿Cómo se diferencia entre el "orden" cuando se repite el mismo token? ¿Es "a7b7" diferente de "c7d7" en el orden de los 7?

De todos modos, esto debería funcionar:

 ls *7*7*7*

Simplemente deja que el caparazón resuelva el problema, pero tal vez no entendí bien.

EDITAR: Lo anterior es incorrecto, incluye casos con más de cuatro 7s que no se desean. Suponiendo que esto es bash, y se ha habilitado el globbing extendido, esto funciona:

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

Esto se lee como "cero o más caracteres que no son sietes, seguidos por siete, seguidos por cero o más caracteres que no son siete", y así sucesivamente. Es importante entender que el asterisco es un operador de prefijo aquí, que opera en la expresión ([^7])que significa "cualquier carácter excepto 7".

Respondida el 12/03/2009 a las 04:15
fuente por usuario unwind


Aquí podría ser tu PUBLICIDAD


votos
5

Supongo que quieres encontrar archivos que contengan exactamente tres 7, pero no más. Usando gnu grep con el parámetro de extensión de expresiones extendidas ( -E):


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

Debería hacer el truco.

Básicamente eso coincide con 3 apariciones de "no 7 seguido de un 7", luego un grupo de "no 7" en toda la cadena (el ^ y $ al principio y al final del patrón, respectivamente).

Respondida el 12/03/2009 a las 04:35
fuente por usuario John Montgomery

votos
2

Una solución de Perl:

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

(Tengo un directorio con números de 4 dígitos. 1777 y 2777 no existen. :-)

Respondida el 12/03/2009 a las 05:53
fuente por usuario Jon Ericson

votos
2

Algo como esto:

printf '%s\n' *|awk -F7 NF==4
Respondida el 12/03/2009 a las 05:31
fuente por usuario Dimitre Radoulov

votos
1

O en lugar de hacerlo en un solo grep, use un grep para buscar archivos con 3 o más 7s y otro para filtrar 4 o más 7s.

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

Podrías mover parte del trabajo en el globo de la carcasa con el más corto

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

aunque si hay una gran cantidad de archivos que coinciden con ese patrón, este último no funcionará debido a los límites incorporados al tamaño glob.

La '-f' en 'ls' es para evitar que 'ls' clasifique los resultados. Si hay una gran cantidad de archivos en el directorio, la hora de ordenar puede ser bastante notable.

Este proceso de filtro de dos pasos es, creo, más comprensible que usar los patrones [^ 7].

Además, esta es la solución como un script de Python, ya que lo solicitó como una opción.

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

Esto manejará unos pocos casos que los comandos de shell no tendrán, como nombres de archivo (malvados) que contienen un carácter de nueva línea. Aunque incluso aquí la salida en ese caso probablemente todavía estaría mal, o al menos no preparada por los programas posteriores.

Respondida el 12/03/2009 a las 05:39
fuente por usuario Andrew Dalke