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