Как обрезать длину строки STDIN?

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

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

#!/usr/bin/perl

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

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

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

Итак, мой вопрос похож на обратный вопрос: как мне обрезать строку стандартного ввода без написания программы для этого?


person Kyle Cronin    schedule 26.09.2008    source источник
comment
Как это «не связано с программированием»?   -  person Stephen Deken    schedule 26.09.2008
comment
Конечно, это связано с программированием. Зачем закрывать?   -  person Brent.Longborough    schedule 26.09.2008
comment
Мне просто нужен был быстрый и грязный ответ - я снова открыл его, так что не стесняйтесь вносить свой вклад. Причина, по которой это не было связано с программированием, заключалась в том, что вместо программы использовалось средство командной строки.   -  person Kyle Cronin    schedule 26.09.2008


Ответы (8)


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

cut -b 1-LIMIT

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

person nobody    schedule 26.09.2008
comment
Примечание: это будет считать байты. Раз он просил символы, то почему бы и не cut -c? - person Turadg; 29.07.2011

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

person nobody    schedule 26.09.2008

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

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

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

person Yanick    schedule 26.09.2008
comment
Умное регулярное выражение, но я хотел / хотел уйти от программных решений. - person Kyle Cronin; 26.09.2008

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

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

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

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

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

person ysth    schedule 26.09.2008

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

typeset -L70 line
while read line
do
  print $line
done
person runrig    schedule 26.09.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";
}
person dland    schedule 26.09.2008

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

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

person Sam Martin    schedule 26.09.2008

Если я не ошибаюсь, команда UNIX «fold» была разработана именно для этого:

$ 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
person Ed Morton    schedule 15.10.2012
comment
Это в основном противоположно тому, что я искал. Например, при просмотре строк файла журнала раздражает, когда текст переносится на несколько строк. Цель этого вопроса состояла в том, чтобы определить, есть ли способ обрезать выходные строки, чтобы не было никакого переноса. Из вашего примера кажется, что задача fold состоит в том, чтобы вызывать перенос строк. - person Kyle Cronin; 15.10.2012
comment
А, я думал, ты просто недоволен тем, как завернуты строки, а не тем, что они завернуты. Тогда решение для вырезания является правильным, и вы можете использовать eval $(ttype -s) для автоматической установки переменной COLUMNS для ширины выреза, если хотите. - person Ed Morton; 17.10.2012