¿Insiste en usar sed? Esto es fácil, por ejemplo en python. Y sin duda aún más fácil en perl. Aunque la pregunta no está terriblemente bien definida. ¿Copiar un archivo, eliminar todas las líneas más largas que 2048, o algo más?
Recibo el mensaje de error sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
miércoles
1
@wedi probablemente desee instalar la versión GNU en lugar de la versión BSD que se incluye con Mac. Esto es fácil con brew
Freedom_Ben
La pregunta dice "si es más largo que XY (por ejemplo, 2048 caracteres)". Entonces debe ser> 2048 y no => 2048
ajcg
1
@ajcg, es> 2048. Observe que hay un período adicional al final de la expresión regular para que coincida con el carácter 2049.
forcefsck
@forcefsck y no sería mejor si lo quitas "^"? (con su comando solo está eliminando líneas que "comienzan con XYZ", pero si XYZ está en otra parte de la línea, entonces no lo elimina)
ajcg
7
Aquí hay una solución que elimina líneas que tienen 2049 o más caracteres:
sed -E '/.{2049}/d' <file.in >file.out
La expresión /.{2049}/dcoincidirá con cualquier línea que contenga al menos 2049 caracteres y los elimine de la entrada, produciendo solo una línea más corta en la salida.
Con awklíneas de impresión de longitud 2048 o menor:
Personalmente, @Faheem, prefiero tu respuesta. La razón es que fue muy fácil para mí convertirlo en 'eliminar todas las líneas más pequeñas que x'. No uso Python todo el tiempo, pero cuando lo hago, siempre siento que debería aprenderlo bien.
ixtmixilix
@ixtmixilix: Sí, usar un lenguaje con todas las funciones como Python es bastante flexible. Gracias por el comentario.
lol, pero sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
alex grey
Ah Instalé la versión GNU en lugar de la versión BSD que viene con Mac como @Freedom_Ben sugirió anteriormente. Pero Kusalananda encontró el interruptor para habilitar la expresión regular extendida. Por lo tanto, debe seguir con su solución si todavía tiene ese problema. ;)
Mié
0
Con gnu-sed, puede usar la bandera -r para evitar escribir las barras diagonales inversas y una coma para definir un intervalo abierto:
sed -r "/.{2049,}/d" input.txt > output.txt
con:
x {2049} significa exactamente 2049 xs
x {2049,3072} que significa desde 2049 a 3072 xs
x {2049,} significa al menos 2049 xs
x {, 2049} que significa como máximo 2049 xs
Para los intervalos, para no coincidir con patrones más grandes, necesitaría anclas de línea como
Respuestas:
fuente
sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)
(Mac OS X)Aquí hay una solución que elimina líneas que tienen 2049 o más caracteres:
La expresión
/.{2049}/d
coincidirá con cualquier línea que contenga al menos 2049 caracteres y los elimine de la entrada, produciendo solo una línea más corta en la salida.Con
awk
líneas de impresión de longitud 2048 o menor:Imitando la
sed
solución literalmente conawk
:fuente
sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)
(Mac OS X)Algo como esto debería funcionar en Python.
fuente
fuente
-l
no es necesario, sin embargo.Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
length($_) > 2048 && print
.length
es un atajo delength($_)
todos modos.Las respuestas anteriores no me funcionan en Mac OS X 10.9.5.
El siguiente código funciona:
sed '/.\{2048\}/d'
.Aunque no se le solicite, pero se proporciona como referencia, lo contrario se puede lograr con el siguiente código:
sed '/.\{2048\}/!d'
.fuente
sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)
(Mac OS X, 10.10.4
)Con gnu-sed, puede usar la bandera -r para evitar escribir las barras diagonales inversas y una coma para definir un intervalo abierto:
con:
Para los intervalos, para no coincidir con patrones más grandes, necesitaría anclas de línea como
fuente