2008-09-26 19 views
7

He estado analizando algunos archivos de registro y he descubierto que algunas líneas son demasiado largas para mostrarlas en una línea, por lo que Terminal.app amablemente las envuelve en la siguiente línea. Sin embargo, he estado buscando una manera de truncar una línea después de una cierta cantidad de caracteres para que Terminal no se ajuste, lo que hace que sea mucho más fácil detectar patrones.Truncar la longitud de la línea stdin?

me escribió un pequeño script en Perl para hacer esto:

#!/usr/bin/perl 

die("need max length\n") unless $#ARGV == 0; 

while (<STDIN>) 
{ 
    $_ = substr($_, 0, $ARGV[0]); 
    chomp($_); 
    print "$_\n"; 
} 

Pero tengo la sensación de que esta funcionalidad está construido probablemente en algunas otras herramientas que yo no sé lo suficiente sobre a (SED?) usar para esta tarea.

Así que mi pregunta es una pregunta inversa: ¿cómo trunco ​​una línea de stdin SIN escribir un programa para hacerlo?

+0

cómo es esto 'no relacionada programación'? –

+0

Por supuesto está relacionado con la programación.¿Por qué cerrarlo? –

+0

Solo necesitaba una respuesta rápida y sucia: la he abierto nuevamente, así que no dude en contribuir. La razón por la que esto no estaba 'relacionado con la programación' se debía a que implicaba el uso de una herramienta de línea de comandos en lugar de un programa. –

Respuesta

12

producción de tubos a:

cut -b 1-LIMIT 

Dónde límite es la anchura de la línea deseada.

+3

Nota: esto contará los bytes. Como pidió caracteres, ¿por qué no 'cortar -c'? – Turadg

11

Otra táctica que uso para ver archivos de registro con líneas muy largas es conectar el archivo a "menos -S". La opción -S para menos imprimirá las líneas sin envolver, y puede ver la parte oculta de las líneas largas presionando la tecla de la flecha hacia la derecha.

2

No exactamente responder a la pregunta, pero si quiere seguir con Perl y utilizar una sola línea, una posibilidad es:

$ perl -pe's/(?<=.{25}).*//' filename 

, donde 25 es la longitud de la línea deseada.

+0

Clever regex, pero estoy/estaba buscando alejarme de las soluciones programáticas. –

0

La manera habitual de hacer esto sería

perl -wlne'print substr($_,0,80)' 

golfed (para 5.10):

perl -nE'say/(.{0,80})/' 

(No pensar en ella como la programación, piensa en él como el uso de una línea de comandos herramienta con un gran número de opciones.) (Sí, la referencia python es intencional.)

0

Una solución de shell Korn (truncar a 70 caracteres - fácil de parametrizar):

typeset -L70 line 
while read line 
do 
    print $line 
done 
0

Usted puede utilizar una variable ligada que clips de su contenido a una longitud fija:

#! /usr/bin/perl -w 

use strict; 
use warnings 
use String::FixedLen; 

tie my $str, 'String::FixedLen', 4; 

while (defined($str = <>)) { 
    chomp; 
    print "$str\n"; 
} 
0

Esto no es exactamente lo que están pidiendo, pero GNU Screen (incluido con OS X, si Recuerdo correctamente, y es común en otros sistemas * nix) le permite activar/desactivar el ajuste de línea (Ca r y Ca Cr). De esta manera, simplemente puede cambiar el tamaño de su terminal en lugar de canalizar cosas a través de un script.

La pantalla básicamente le proporciona terminales "virtuales" dentro de una aplicación de terminal de nivel.

0
use strict; 
use warnings 
use String::FixedLen; 

tie my $str, 'String::FixedLen', 4; 

while (defined($str = <>)) { 
    chomp; 
    print "$str\n"; 
} 
0

A menos que me falta el punto, el UNIX "pliegue" comando fue diseñado para hacer exactamente eso:

$ cat file 
the quick brown fox jumped over the lazy dog's back 

$ fold -w20 file 
the quick brown fox 
jumped over the lazy 
dog's back 

$ fold -w10 file 
the quick 
brown fox 
jumped ove 
r the lazy 
dog's bac 
k 

$ fold -s -w10 file 
the quick 
brown fox 
jumped 
over the 
lazy 
dog's back 
+1

Esto es básicamente lo contrario de lo que estaba buscando. Al ver las líneas de un archivo de registro, por ejemplo, es molesto cuando el texto se envuelve en varias líneas. El propósito de esta pregunta era determinar si había una forma de truncar las líneas de salida para que no hubiera ningún ajuste. Según su ejemplo, parece que la tarea de fold es * causar * el ajuste de líneas. –

+0

Ah, pensé que estabas descontento con la forma en que las líneas no envolvieron el hecho de que se envolvieron. Luego, la solución de corte es la correcta y puede usar eval $ (ttype -s) para establecer automáticamente la variable COLUMNS para el ancho de corte si lo desea. –

Cuestiones relacionadas