Extendidas
Para usar las Expresiones Regulares Extendidas en el comando grep
deberemos usar la opción -E .
Repetición:
- ? : Cero o una vez.
- * : Cero o más veces.
- + : Una o más veces.
- {n} : n veces.
- {n,m} : Entre n y m veces.
- {n,} : Como mínimo n veces.
Otros:
- ( ) : Agrupar.
- | : Pipe Alternancia.
Archivo para el ejemplo...
$ cat numeros.txt
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
?
Cero o una vez.
Buscar los número con 1 o 2 dígitos...
$ grep -E "^[0-9][0-9]?$" numeros.txt
1
1
2
3
5
8
13
21
34
55
89
El símbolo ? hace que el segundo rango aparezca 0 veces o una vez.
*
Cero o más veces.
Si cambiamos por un * aparecera 0 veces o más veces por lo tanto mostrara todos los números.
$ grep -E "^[0-9][0-9]*$" numeros.txt
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
Podemos decir que los primeros números sean del 0 al 9 y los segundos del 0 al 5 por ejemplo. Eso excluirá los 2°, 3° y 4° dígito superior a 5 ...
$ grep -E "^[0-9][0-5]*$" numeros.txt
1
1
2
3
5
8
13
21
34
55
144
233
610
+
Una o más veces.
Esto hará que saque el dato por lo menos una vez.
$ grep -E "^[0-9][0-5]+$" numeros.txt
13
21
34
55
144
233
610
Estamos forzando a que tenga mínimo 2 dígitos.
{n}
Determinar el número exacto de veces que deseamos que se repita el rango.
$ grep -E "^[0-9]{3}$" numeros.txt
144
233
377
610
987
{n,m}
Especificamos un rango de veces. Por ejemplo los números que contengan 2 a 4 veces.
$ grep -E "^[0-9]{2,4}$" numeros.txt
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
{n,}
Mostrará n veces o más el rango especificado.
Por ejemplo los números con 3 a más dígitos.
$ grep -E "^[0-9]{3,}$" numeros.txt
144
233
377
610
987
1597
2584
4181
6765
( )
Agrupar expresiones.
Si queremos los números de 1 dígito y los de 3 dígitos, podemos usar dos expresiones regulares dentro de grep con la opción -e por ejemplo...
$ grep -E -e "^[0-9][0-9][0-9]$" -e "^[0-9]$" numeros.txt
1
1
2
3
5
8
144
233
377
610
987
Pero podemos agrupar ésta opción ...
$ grep -E "^[0-9]([0-9][0-9])?$" numeros.txt
1
1
2
3
5
8
144
233
377
610
987
|
Es un pipe (tubería) y determina que es opcional de tal forma que la anterior expresión regular la podemos expresar de la siguiente manera...
$ grep -E "^([0-9]|[0-9][0-9])$" numeros.txt
1
1
2
3
5
8
13
21
34
55
89
El resultado será el mismo en este caso.
Reducir
En el último caso podríamos reducir la expresión de esta forma...
$ grep -E "^([0-9]|[0-9]{2})$" numeros.txt
1
1
2
3
5
8
13
21
34
55
89
Obtenemos el mismo resultado con menos código.