2008-09-26 12 views
7

Я разбирался в некоторых файлах журналов, и я обнаружил, что некоторые строки слишком длинны для отображения на одной строке, поэтому Terminal.app любезно завертывает их в следующую строку. Тем не менее, я искал способ усечения строки после определенного количества символов, чтобы терминал не обертывался, что упрощало определение шаблонов.Truncate stdin длина линии?

Я написал небольшой скрипт на Perl, чтобы сделать это:

#!/usr/bin/perl 

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

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

Но у меня есть ощущение, что эта функция, вероятно, встроенный в некоторые другие инструменты, которые я просто не знаю достаточно о к (SED?) использовать для этой задачи.

Так что мой вопрос вроде обратного вопроса: как я обрезаю строку stdin БЕЗ написания программы для этого?

+0

Как это "не программирование связанных? – 2008-09-26 01:53:54

+0

Конечно, это связано с программированием.Зачем его закрывать? – 2008-09-26 01:54:08

+0

Мне просто нужен был быстрый и грязный ответ - я открыл его снова, так что не стесняйтесь вносить свой вклад. Причина, по которой это не связано с «программированием», заключалась в том, что она использовала инструмент командной строки вместо программы. – 2008-09-26 02:03:43

ответ

12

выход трубы на:

cut -b 1-LIMIT 

Где предел требуемой ширины линии.

+3

Примечание: это будет считать байты. Поскольку он просил персонажей, почему бы не «вырезать -c»? – Turadg 2011-07-29 15:21:04

11

Другая тактика, которую я использую для просмотра файлов журнала с очень длинными строками, заключается в том, чтобы передать файл «less -S». Опция -S для меньшего количества будет печатать строки без упаковки, и вы можете просмотреть скрытую часть длинных строк, нажав клавишу со стрелкой вправо.

2

Не точно ответить на вопрос, но если вы хотите придерживаться Perl и использовать одну гильзу, возможность есть:

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

где 25 является желаемой длины линии.

0

Обычный способ сделать это было бы

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

Golfed (для 5.10):

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

(Не думайте о нем, как программирование, думать о нем, как с помощью командной строки инструмент с огромным количеством опций.) (Да, python ссылка преднамеренная.)

0

Решение оболочки Korn (усечение до 70 символов - легко параметризуется):

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

Вы можете использовать привязанную переменную, монтируемый его содержимое фиксированной длины:

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

Это не совсем то, что вы просите, но GNU Screen (в комплекте с OS X, если Я правильно помню и обычный в других системах * nix) позволяет включать/отключать перенос строк (Ca r и Ca Cr). Таким образом, вы можете просто изменить размер своего терминала вместо того, чтобы прокладывать материал через скрипт.

Экран в основном дает вам «виртуальные» терминалы в одном приложении терминала верхнего уровня.

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

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

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

Если я не хватает точки, UNIX «складка» команда была разработана, чтобы сделать именно это:

$ 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