سؤال

لقد قمت بتحليل بعض ملفات السجل ووجدت أن بعض الأسطر طويلة جدًا بحيث لا يمكن عرضها على سطر واحد، لذا يرجى من 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 دون كتابة برنامج للقيام بذلك؟

هل كانت مفيدة؟

المحلول

إخراج الأنابيب إلى:

cut -b 1-LIMIT

حيث LIMIT هو عرض الخط المطلوب.

نصائح أخرى

أسلوب آخر أستخدمه لعرض ملفات السجل ذات الأسطر الطويلة جدًا هو توجيه الملف إلى "أقل -S".سيؤدي الخيار -S لأقل إلى طباعة الخطوط دون التفاف، ويمكنك عرض الجزء المخفي من الخطوط الطويلة بالضغط على مفتاح السهم الأيمن.

لا تجيب على السؤال بالضبط، ولكن إذا كنت تريد الاستمرار في استخدام لغة Perl واستخدام سطر واحد، فالاحتمال هو:

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

حيث 25 هو طول السطر المطلوب.

الطريقة المعتادة للقيام بذلك ستكون

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

لعبة الجولف (لـ 5.10):

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

(لا تفكر في الأمر على أنه برمجة، بل فكر في الأمر على أنه استخدام أداة سطر أوامر تحتوي على عدد كبير من الخيارات.) (نعم، بيثون الإشارة مقصودة.)

حل Korn Shell (يتم اقتطاعه إلى 70 حرفًا - مع سهولة تحديد المعلمات):

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

يمكنك استخدام متغير مرتبط يقوم بقص محتوياته بطول ثابت:

#! /usr/bin/perl -w

use strict;
use warnings
use String::FixedLen;

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

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

هذا ليس بالضبط ما تطلبه، ولكن شاشة جنو (المضمن مع OS X، إذا كنت أتذكر بشكل صحيح، وهو شائع في أنظمة *nix الأخرى) يتيح لك تشغيل/إيقاف التفاف الخط (C-a r وC-a C-r).بهذه الطريقة، يمكنك ببساطة تغيير حجم المحطة الطرفية الخاصة بك بدلاً من تمرير الأشياء عبر البرنامج النصي.

تمنحك الشاشة بشكل أساسي محطات "افتراضية" ضمن تطبيق طرفي واحد عالي المستوى.

use strict;
use warnings
use String::FixedLen;

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

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

ما لم أفتقد هذه النقطة، فقد تم تصميم أمر "fold" لنظام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top