用perl在两行之间插入新行[关闭]

Posted

技术标签:

【中文标题】用perl在两行之间插入新行[关闭]【英文标题】:Insert new line between two lines with perl [closed] 【发布时间】:2011-12-12 08:49:02 【问题描述】:

我想在第 2 行和第 3 行中插入包含此行的连接字符串的行

abc
abcd:
abc
abcd

输出:

abc
abcd:
abcd: abcd
abc
abcd

【问题讨论】:

-1 因为这是一个很容易在 oneliner 中解决的“食谱”问题 【参考方案1】:

您想在以冒号结尾的行之后,还是在第 2 行之后添加一些内容?

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

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

【讨论】:

我想在以冒号结尾的行之后添加一些内容。谢谢【参考方案2】:

由于您没有指定要在以冒号结尾的每一行之后放置什么内容,因此我创建了一个表格来代表一些通用决策和一些灵活的处理方式。

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

在当前行之后“插入”一行就像将该文本附加到当前行并输出一样简单。

【讨论】:

【参考方案3】:
perl -p -i.bck -e "if ($last ne '') $_=~s/.*/$last $&\\n$&/; $last='' elsif (/:/) $last = $_;chomp($last); else $last = '';" test

test 是有问题的文件

【讨论】:

运行那条线,我得到错误syntax error at -e line 1, near "( ne" syntax error at -e line 1, near ";"

以上是关于用perl在两行之间插入新行[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?

需要帮助在 macOS 上使用 sed 在两次连续匹配后插入文本 [关闭]

使用自动成对关闭时如何在 Vim 中设置自动插入新行和缩进

需要加速 PERL 脚本(每行输入需要 1 秒)[关闭]

perl 5.8 和 5.10 之间的区别 [关闭]

在两行代码之间渲染