简体   繁体   English

如何匹配上下两行,然后使用Perl在其中插入单词?

[英]How to match above and below lines, then insert words in between them by using Perl?

How to match special characters and multiple lines at the same time? 如何同时匹配特殊字符和多行? Then insert text in between those matched lines. 然后在这些匹配的行之间插入文本。 I would like to match lines - Sample ("xx"),direction:north and market_fall ("when_promotion_8X10_b05afn10ld0b0") { as shown below. 我想匹配行-样本(“ xx”),direction:north和market_fall(“ when_promotion_8X10_b05afn10ld0b0”){如下所示。 Then print text after line color code:0.000;. 然后在行颜色代码之后打印文本:0.000;。 My coding seems wrong in somewhere. 我的编码在某处似乎是错误的。 Could anyone give guidance? 谁能提供指导? Thank you.. 谢谢..

Sample ("apple") {
direction : north ;
      I dont want this line+: ;
      I dont want this line^ ;
      No this line : line ;
      color code: 0.000;
      I dont want this line: (c*b)+(c*a)+(b*a))" ;
      max_price : 3.6;
      min_price : 1.2;
      I dont want this line_time() {
        I dont want this line_t_sense : positive_1 ;
        No_this line either  : "c" ;
        market_fall ("when_promotion_8X10_b05afn10ld0b0") {  

My coding: 我的编码:

if(my $line =~ m/Sample(" ")/ & /direction : north/ & /market_fall ("when_promotion_8X10_b05afn10ld0b0") {/ ){    #match specific line

        print "aa\n";                 #print words at previous line
}
}

Try following perl one-liner from shell 尝试从shell跟随perl一线

perl -0777 -pe 's/(Sample\s*\("[^"]+"\)\s*\{.*direction\s*:\s*\w+\s*;.*color\s*code:\s*0.000;)(.*market_fall\s*\("[^"]+"\))/$1\nLineYouWantToInsert$2/gs' file

EDIT 编辑

If you must use it within a perl script try following piece of code. 如果必须在perl script使用它,请尝试以下代码。

#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '<', 'file' or die $!;
my $line = do { local $/; <$fh> };
$line =~ s/(Sample\s*\("[^"]+"\)\s*\{.*direction\s*:\s*\w+\s*;.*color\s*code:\s*0.000;)(.*market_fall\s*\("[^"]+"\))/$1\nLineYouWantToInsert$2/gs;
print $line;
close $fh

I like abiessu's suggestion. 我喜欢阿比苏的建议。 Here is some sample code: 这是一些示例代码:

#!/usr/bin/perl

my $l1;
my $l2;

    while( my $line = <> ){
      $l1 = $l2;
      $l2 = $line;

        if( $l1 =~ /start1/ && $l2 =~ /start2/ ){
            print $l1;
            print "Inserted Text\n";
            print $l2;
      }
      else {
            print $l2;
      }
    }

given the input: 给定输入:

a
b
c
start1
start2
d
e

You will get: 你会得到:

a
b
c
start1
start1
Inserted Text
start2
d
e

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM