Encontré una pregunta similar:
Pero en este caso no quiero comprobar la longitud total, sino el número de dígitos de la línea. Por ejemplo, de esta entrada:
cdc85e24-b9e9-8802-080a-b84479e1ae82
ekodeveloper0
1795475824.1129747.1472396049615.ref
1795475824.1129747.1472396049615
967175540.1194446.1472407271491
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
¿Cómo puedo eliminar todas las líneas con más de N dígitos?
Respuesta1
Dado que etiquetó su pregunta perl
, una forma de hacerlo en Perl sería aprovechar el hecho de que Perl tr
devuelve un recuento del número de caracteres reemplazados; así que por ejemplo (tomando N = 13
) podrías hacer
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Una forma posiblemente más convencional sería evaluar la coincidencia de expresiones regulares en un contexto escalar para obtener un recuento.
perl -ne '$c = () = /\d/g; print unless $c > 13' file
ver por ejemplo¿Existe un atajo de Perl para contar el número de coincidencias en una cadena?
Respuesta2
Es más fácil mantener solo las líneas que tienen X omásnúmeros. Aquí hay un ejemplo de eso donde X es 13:
sed -n 's/[0-9]/&/13p' input.txt > output.txt
Sin embargo, puede modificar esto para hacer lo contrario. Aquí hay un comando que solo mantendrá las líneas que tenganmenos de 13números:
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Explicación: imprima solo líneas con más de 13 números
sed -n 's/[0-9]/&/13p' input.txt > output.txt
El &
símbolo en el texto de reemplazo significa "todo lo que coincidió".
El indicador numérico en el s
comando (después de la /find/replace/
parte) significa que solo se reemplaza esa instancia del patrón de búsqueda.
La p
bandera en el s
comando significa "imprimir si se realizó una sustitución".
El -n
cambio, por supuesto, es suprimir la acción de "imprimir" predeterminada de Sed.
Explicación: imprima solo líneas con <13 números
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
El -e
cambio es "ejecutar"; simplemente pasa un comando. Lo necesitamos aquí ya que estamos pasando por más de uno.
El t
comando omite los comandos restantes si el último s
comando realizó una sustitución.
El p
comando se imprime.