Usando grep para filtrar carpetas con números

Usando grep para filtrar carpetas con números

Estaba intentando enumerar solo carpetas con números que filtran unls -1(la opción -1esenumerar un archivo por línea) a través de grep (sé que find también puede hacerlo, pero por el bien de este ejemplo quiero seguir con grep)

Las carpetas son

PC:test user$ ls -1
1184
36
69929
7
9907

Ahora esto es lo que obtengo con las diferentes salidas...

Este: No entiendo por qué 9907 está allí, ya que de alguna manera tenía sentido que solo estuviera la carpeta 7 de un solo dígito.

PC:test user$ ls -1 | grep [0-9]
7
9907

A esto le falta 7. ¿Significa .2 o más?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

¿Esto significa hacer coincidir todo lo que tenga un número allí?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

Entre comillas, simplemente funciona como era de esperar, entonces, ¿por qué? ¿Es el equivalente a [0-9].*?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

Respuesta1

"sustitución de nombre de archivo" o "expansión de nombre de ruta" o "globbing"

Cuando escribes un comando, está sujeto a varias etapas de transformación potencial.antesse invoca cualquier programa (como grep).

[es un carácter especial en algunos shells.

$ echo [0-9]
7

Lo que creo que está sucediendo aquí es que el Shell está expandiendo 0-9 como una selección de nombre de archivo y encuentra su archivo "7" y, por lo tanto, pasa "7" a grep. Por lo tanto, grep busca nombres de archivos que contengan un "7" en cualquier parte del nombre del archivo.

Si desea [que grep lo procese y no el shell, debe citar la cadena o engañar al shell para que analice la expresión de manera diferente.

$ echo [0-9].
[0-9].

Se recomienda citar.

Véase también man bash (busque for) man testy la página 151 deeste


expresiones regulares

En una expresión regular, .significa "cualquier carácter". Significa [0-9].cualquier dígito seguido de un solo carácter. El nombre del archivo 7carece de este último.


Si desea que grep encuentre nombres de archivos de un solo dígito, debe anclar su expresión tanto al inicio como al final de la línea.

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

Ups, destruí mi computadora.

El uso descuidado de caracteres especiales conduce a todo tipo de resultados interesantes.

$ ls -1 > x
$ grep *
x:1184

Esto debería quedar más claro si consideramos

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

Ahora simplemente agregue rmy sudoa la mezcla y podrá tener una experiencia que podría cambiar drásticamente su carrera.

información relacionada