Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何匹配上面和下面的行,然后使用Perl在它们之间插入单词?_Regex_Perl_Match - Fatal编程技术网

Regex 如何匹配上面和下面的行,然后使用Perl在它们之间插入单词?

Regex 如何匹配上面和下面的行,然后使用Perl在它们之间插入单词?,regex,perl,match,Regex,Perl,Match,如何同时匹配特殊字符和多行?然后在匹配的行之间插入文本。我想匹配行-示例(“xx”),方向:北方和市场(“when_promotion_8X10_b05afn10ld0b0”){如下所示。然后在行颜色代码后打印文本:0.000;。我的编码似乎在某处出错。有人能给我指导吗?谢谢 Sample ("apple") { direction : north ; I dont want this line+: ; I dont want this line^ ; No

如何同时匹配特殊字符和多行?然后在匹配的行之间插入文本。我想匹配行-示例(“xx”),方向:北方和市场(“when_promotion_8X10_b05afn10ld0b0”){如下所示。然后在行颜色代码后打印文本:0.000;。我的编码似乎在某处出错。有人能给我指导吗?谢谢

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") {  
我的编码:

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

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

尝试使用shell中的
perl
一行代码

编辑

如果必须在
perl脚本中使用它,请尝试以下代码

#!/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
!/usr/bin/perl
严格使用;
使用警告;

打开我的$fh,“我喜欢abiessu的建议。以下是一些示例代码:

#!/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;
      }
    }
您将获得:

a
b
c
start1
start1
Inserted Text
start2
d
e

一种方法是使用多行regexp:
s/(onelinematch)\n(secondlinematch)/$1\n\n$2/gm;
我不确定强制进行完整多行匹配的确切标志,但这是一般的想法。或者,您可以在单独的行上循环,并在两个单独的变量中一次保留两个连续的行,当两行都符合您的条件时,将您想要的内容写入输出文件。您怎么办es
$line
包含?1)无法使用按位AND
&
运算符链接正则表达式匹配项。一方面,它是错误的运算符。另一方面,您必须对新正则表达式再次使用
=~
运算符。2)如果使用
my$line
,则意味着您声明了一个新的
$line
变量,该变量为空除了空字符串之外,我永远不会匹配任何东西,如果打开了警告,你就会知道这一点。@TLP-谢谢。我想在这个文件中逐行匹配。这就是$line的意思。有很多类似的行,如上面的示例代码。如果这些行不是固定词,如何匹配它们?比如说sample(“橙色”)…sample(“adf”),市场下跌(“促销时”){,市场下跌(“促销时”){唯一方向:输出是固定行。
(?:.| \n)*
写得更好的
[。\n]但是,您应该真正考虑使用“代码> /S/<代码>修饰符,允许通配符<代码> .<代码>也匹配NeXLIN。然后将其简化为<代码> */COD>。此外,使用反斜杠表示捕获组,例如“代码> 1”/代码>。您应该使用标量变量表示法,例如“代码> 1美元< /代码>。@ TL。P谢谢你的评论。将
\1
更改为
$1
。但是
[.\n]*
对我不起作用。请你交叉核对一下好吗?我不知道
/s
,我一定会看一看。似乎
在字符类括号中没有保留其元字符功能
[…]
,所以不能使用它。跳过这一部分,只使用带有
/s
修饰符的
*
。@jksah,谢谢。我可以同时使用一个liner和perl脚本吗?我需要使用#!/bin/sh而不是#!/usr/bin/perl来调用perl吗?
a
b
c
start1
start2
d
e
a
b
c
start1
start1
Inserted Text
start2
d
e