Вставьте новую строку между двумя строками с помощью Perl

Я хочу вставить строку между строкой 2 и строкой 3, которая содержит объединенную строку из этой строки

abc
abcd:
abc
abcd

Выход:

abc
abcd:
abcd: abcd
abc
abcd

3 ответа

perl -p -i.bck -e "if ($last ne ''){ $_=~s/.*/$last $&\\n$&/; $last=''} elsif (/:/) {$last = $_;chomp($last);} else {$last = '';}" test

test - это файл, о котором идет речь

Поскольку вы не указываете, что вы хотите поместить после каждой строки, заканчивающейся двоеточием, я создал таблицу для обозначения некоторых общих решений и несколько гибкой обработки.

# create a table
my %insert_after 
    = ( abcd => "abcd: abcd\n"
      , defg => "defg: hijk\n"
      );

# create a list of keys longest first, and then lexicographic 
my $regs  
    = '^(' 
    . join( '|', sort { length $b <=> length $a or $a cmp $b } 
                 keys %insert_after 
          )
    . '):$'
    ;
my $regex = qr/$regs/;

# process lines.
while ( <> ) { 
    m/$regex/ and $_ .= $insert_after{ $1 } // '';
    print;
}

"Вставить" строку после текущей так же просто, как добавить этот текст к текущей и вывести его.

Вы хотите добавить что-нибудь после строки, которая заканчивается двоеточием, или после строки 2?

Если после строки 2, вы можете split("\n", $string) чтобы получить массив строк, сплайсируйте новую строку в массив в позиции 2, а затем join("\n", @array) чтобы вернуть строку.

Если после строки, заканчивающейся в двоеточии, вы можете использовать регулярное выражение: s/(:\n)/\1YOUR_NEW_LINE_HERE\n/,

Другие вопросы по тегам