Как урезать длину строки STDIN? - PullRequest
7 голосов
/ 26 сентября 2008

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

Я написал небольшой Perl-скрипт для этого:

#!/usr/bin/perl

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

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

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

Так что мой вопрос вроде обратного: как мне обрезать строку stdin, не написав программу для этого?

Ответы [ 9 ]

12 голосов
/ 26 сентября 2008

Труба выводится до:

cut -b 1-LIMIT

Где LIMIT - желаемая ширина линии.

11 голосов
/ 26 сентября 2008

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

2 голосов
/ 26 сентября 2008

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

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

где 25 - желаемая длина строки.

0 голосов
/ 15 октября 2012

Если я не упущу суть, команда 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
0 голосов
/ 11 мая 2009
use strict;
use warnings
use String::FixedLen;

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

while (defined($str = <>)) {
    chomp;
    print "$str\n";
}
0 голосов
/ 27 сентября 2008

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

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

0 голосов
/ 27 сентября 2008

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

#! /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 голосов
/ 26 сентября 2008

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

typeset -L70 line
while read line
do
  print $line
done
0 голосов
/ 26 сентября 2008

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

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

Гольф (для 5.10):

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

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

...