2008-09-26 12 views
7

J'ai analysé certains fichiers journaux et j'ai trouvé que certaines lignes étaient trop longues à afficher sur une ligne, Terminal.app les amène donc à la ligne suivante. Cependant, je cherchais un moyen de tronquer une ligne après un certain nombre de caractères afin que Terminal n'emballe pas, ce qui rend beaucoup plus facile de repérer des motifs.Tronquer la longueur de la ligne stdin?

J'ai écrit un petit script Perl pour ce faire:

#!/usr/bin/perl 

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

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

Mais j'ai le sentiment que cette fonctionnalité est probablement intégrée dans d'autres outils que je ne sais pas assez sur le point (sed?) utiliser pour cette tâche.

Donc, ma question sorte d'une question inverse: comment puis-je tronquer une ligne de stdin SANS écrire un programme pour le faire?

+0

Comment est ce « pas une programmation connexe »? –

+0

Bien sûr, c'est lié à la programmation.Pourquoi le fermer? –

+0

J'avais juste besoin d'une réponse rapide et facile - je l'ai ouvert à nouveau, alors n'hésitez pas à contribuer. La raison pour laquelle ce n'était pas «lié à la programmation» était que cela impliquait l'utilisation d'un outil de ligne de commande au lieu d'un programme. –

Répondre

12

sortie de tuyau à:

cut -b 1-LIMIT 

dont la limite est la largeur de ligne souhaitée.

+3

Note: cela va compter les octets. Depuis qu'il a demandé des caractères, pourquoi ne pas «couper -c»? – Turadg

11

Une autre tactique que j'utilise pour afficher les fichiers journaux avec de très longues lignes est de canaliser le fichier à "less -S". L'option -S pour moins imprimera des lignes sans retour à la ligne, et vous pourrez voir la partie cachée des lignes longues en appuyant sur la touche flèche droite.

2

ne répond pas exactement à la question, mais si vous voulez coller avec Perl et d'utiliser une seule ligne, une possibilité est:

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

où 25 est la longueur de ligne souhaitée.

+0

Une regex intelligente, mais je cherchais/je cherchais à m'éloigner des solutions programmatiques. –

0

La manière habituelle de faire serait

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

golfed (pour 5,10):

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

(Ne pensez pas comme la programmation, pensez comme en utilisant une ligne de commande outil avec un grand nombre d'options.) (Oui, la référence python est intentionnelle.)

0

Une solution Korn shell (tronquée à 70 caractères - facile à paramétrer):

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

Vous pouvez utiliser une variable liée que les clips de son contenu à une longueur fixe:

#! /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

Ce n'est pas exactement ce que vous demandez, mais GNU Screen (inclus avec OS X, si Je me souviens bien, et commun sur d'autres systèmes * nix) vous permet d'activer/désactiver l'enrubannage (Ca r et Ca Cr). De cette façon, vous pouvez simplement redimensionner votre terminal au lieu de rediriger les choses dans un script.

L'écran vous donne essentiellement des terminaux «virtuels» dans une application de terminal de premier niveau.

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

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

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

À moins que je manque le point, UNIX « fold » commande a été conçu pour faire exactement cela:

$ 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

C'est fondamentalement le contraire de ce que je cherchais. Lorsque vous affichez des lignes d'un fichier journal, par exemple, c'est embêtant lorsque le texte est enveloppé sur plusieurs lignes. Le but de cette question était de déterminer s'il y avait un moyen de tronquer les lignes de sortie afin qu'il n'y ait pas d'emballage. D'après votre exemple, il semble que la tâche de fold consiste à * provoquer * l'encapsulation des lignes. –

+0

Ah, je pensais que vous étiez juste mécontent de la façon dont les lignes se sont enveloppées et non du fait qu'elles ont été emballées. Ensuite, la solution coupée est la bonne et vous pouvez utiliser eval $ (ttype -s) pour définir automatiquement la variable COLUMNS pour la largeur de coupe si vous le souhaitez. –

Questions connexes