เส้นของฉัน:
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
ฉันต้องการรวมบรรทัดที่ลงท้ายด้วยโคลอน โดยมีบรรทัดถัดไป:
ABC: XYZ
XYZ ABC: XYZ
XYZ: ABC
XYZ
ABC: AAB
CCD
เส้นของฉัน:
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
ฉันต้องการรวมบรรทัดที่ลงท้ายด้วยโคลอน โดยมีบรรทัดถัดไป:
ABC: XYZ
XYZ ABC: XYZ
XYZ: ABC
XYZ
ABC: AAB
CCD
หากเนื้อหาพอดีกับหน่วยความจำ ให้โหลดเนื้อหานั้นลงในตัวแปรเดียวแล้วทำดังนี้
$text =~ s/:\n/: /g
หากคุณต้องการแก้ไขไฟล์ ให้ใช้บรรทัดคำสั่งนี้:
% perl -i.orig -pe 'chomp if /:$/' yourfile
หากคุณอยู่ในลูปอินพุตและต้องการรวบรวมข้อมูลที่ลงท้ายด้วยโคลอน ให้ทำดังนี้
while (<>) {
chomp;
if (/:$/ && !eof) {
$_ .= <>;
redo unless eof;
}
# now you have your cuddled line(s), proceed as before
...
}
นี่ถือว่าบรรทัดสุดท้ายของไฟล์ของคุณไม่ใช่บรรทัดต่อ
unless eof
แบบเสรีนิยมจะช่วยดูแลสิ่งนั้นได้ แต่มันไม่มีประโยชน์มากนักสำหรับ tty
- person tchrist; 05.11.2011
ความพยายามของฉันในเวอร์ชันที่สวยงามยิ่งขึ้น
while (<DATA>) {
chomp;
print $_;
print /:$/ ? " " : "\n";
}
ความพยายามที่เก่ากว่าและไม่เป็นที่พอใจ คำตอบนี้เก็บเฉพาะบรรทัดปัจจุบันไว้ในหน่วยความจำเท่านั้น ไม่จำเป็นต้องใส่อินพุตหรือสร้างเอาต์พุตทั้งหมดในหน่วยความจำ นอกจากนี้ยังจัดการข้อมูลว่างได้อย่างถูกต้อง ไม่มีการพิมพ์หากไม่มีอินพุต
#!/usr/bin/env perl
use strict;
use warnings;
my $text;
while( my $line = <DATA> ) {
if ($line =~ /:\s*\n/ && defined $text) {
print $text;
undef $text;
}
$line =~ s/:\s*\n/: /g;
$text .= $line;
}
print $text if defined $text;
__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
คำแนะนำทั้งสองจนถึงตอนนี้แนะนำให้แนบไฟล์ลงในหน่วยความจำ แต่ไม่จำเป็นอย่างยิ่งหากมีคำถามเดิม
#!/usr/bin/env perl
use strict;
use warnings;
my $text;
while( my $line = <DATA> ) {
if ($line =~ s/ : \s+ \z /: /x) {
$text .= $line;
}
else {
print $text if is_nonempty_string($text);
print $line;
$text = '';
}
}
print $text, "\n" if is_nonempty_string($text);
sub is_nonempty_string { defined($_[0]) and length($_[0]) }
__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD: