我在bash文件(* .sh)中使用perl寻找正则表达式。 我需要在两种模式之间找到动态模式。
例如:
some data
.
.
.
Pattern1
.. data
Dynamic_Pattern
...data
Pattern2
.
.
data
.
.
Pattern1
..data
Pattern2
输出将是:
Pattern1
.. data
dynamic pattern
...data
Pattern2
我在网上找到了这段代码:
perl -n0e 'while (/Pattern1.*?((?=Pattern2)|(?=$))/sg) {$x=$&;print $x if $x=~/$Dynamic_Pattern/}' file
问题是,如果Dynamic_Pattern id动态,它不起作用,只有它是静态的
答案 0 :(得分:1)
您必须将“动态”部分作为参数传递给perl-oneliner。否则perl会将其视为“他的”变量,当然这是不确定的。您可以使用-s
- 开关启用基本命令行参数(查看here)。模式之前的\Q
应确保引用可能存在问题的字符。
perl -sn0e 'while (/Pattern1.*?((?=Pattern2)|(?=$))/sg) {$x=$&;print $x if $x=~/\Q$dynpattern/}' -- -dynpattern="$Dynamic_Pattern" file
答案 1 :(得分:1)
一个选项是将两个参数传递给perl脚本。第一个是要搜索的动态模式,第二个是带有内容的文件。该脚本将使用触发器提取两个边缘模式之间的线条范围。
确定价值:
searched_pattern="Dynamic_Pattern"
运行perl
脚本:
perl -ne '
BEGIN { $pat = shift }
if ( my $range = ( m/\A(?i)pattern1\b/ ... m/\A(?i)pattern2\b/ ) ) {
$data .= $_;
if ( ( q|E0| eq substr $range, -2 ) && ( $data =~ m/^\Q${pat}\E\b/m ) ) {
printf qq|%s|, $data;
}
else {
next;
}
}
if ( $data ) { undef $data }
' "$searched_pattern" infile
它产生:
Pattern1
.. data
Dynamic_Pattern
...data
Pattern2