Мои строки:
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
, но на телетелефоне она бесполезна.
- 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: