2011-12-12 99 views
-2

之间的新行我想插入线beetwen 2号线和3号线包含来自该行插入两行用Perl

字符串连接
abc 
abcd: 
abc 
abcd 

输出:

abc 
abcd: 
abcd: abcd 
abc 
abcd 
+1

-1,因为这是一个“食谱”的问题在oneliner – Nikodemus

回答

1

您要添加的东西在以冒号结尾的行之后,或者在第2行之后?

如果在第2行之后,您可以split("\n", $string)获取一行数组,将新行拼接到位置2的数组中,然后join("\n", @array)将字符串取回。

如果以冒号结尾的行后面,可以使用正则表达式:s/(:\n)/\1YOUR_NEW_LINE_HERE\n/

+0

我想以冒号结束的行后添加一些容易解决的文件。谢谢 –

1

由于在每行以冒号结尾后,您不指定要放置的内容,所以我创建了一个表来表示一些通用决策以及有些灵活的处理。

# 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; 
} 

在当前行之后插入一行很简单,只需将该文本附加到当前行并输出即可。

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

测试是有问题

+0

运行那个单行程序,我在-e行1附近得到错误'语法错误“(ne” 在-e行1附近的语法错误“;}”' – mrk