Regex 如何将BASH变量插入到PERL正则表达式替换中?

Regex 如何将BASH变量插入到PERL正则表达式替换中?,regex,bash,perl,shell,Regex,Bash,Perl,Shell,我想用数组中的字符串替换某些文本的中间部分 #!/bin/bash array=(1 2 3 4 5 6) for i in "${array[@]}"; do # doesn't work echo "some text" | perl -pe 's|(some).*(text)|\1$i\2|' done 我使用perl正则表达式而不是sed,因为它更容易实现非贪婪匹配支持。获取$i值的正确语法是什么?只需将regexp周围的单引号替换为双引号即可 #!/bin/bas

我想用数组中的字符串替换某些文本的中间部分

#!/bin/bash

array=(1 2 3 4 5 6)

for i in "${array[@]}"; do
    # doesn't work
    echo "some text" | perl -pe 's|(some).*(text)|\1$i\2|'
done

我使用perl正则表达式而不是sed,因为它更容易实现非贪婪匹配支持。获取$i值的正确语法是什么?

只需将regexp周围的单引号替换为双引号即可

#!/bin/bash

array=(1 2 3 4 5 6)

for i in "${array[@]}"; do
    echo "some text" | perl -pe "s|(some).*(text)|\1$i\2|"
done

单引号不会扩展变量。

您可以采取几种方法。问题是,传递给perl的字符串是单引号,这意味着它不会被插值。这通常是个好消息,但在本例中,您实际上是在传递
$i
,并且没有使用该名称的perl变量

一种方法是导出它,然后通过
%ENV
散列将其读入:

export VALUE=3;
perl -e 'print $ENV{'VALUE'},"\n";' 
否则,您“只”需要先插入字符串:

 VALUE=3
 perl -e "print $VALUE;"
尽管在您的示例中,我建议您根本不用麻烦使用shell,并重写:

#!/usr/bin/perl

my @array = qw (1 2 3 4 5 6);

foreach my $element ( @array ) { 
    my $text =  "some text";
    $text =~ s|(some).*(text)|$1$element$2|;
    print $text,"\n";
}

其实还有一个问题。 如果您运行下面的代码,将不会得到预期的结果

#!/bin/bash

array=(1 2 3 4 5 6)

for i in "${array[@]}"; do
    echo "some text" | perl -pe "s|(some).*(text)|\1$i\2|"
done

这是因为在扩展bash变量后,perl代码变成了
perl-pe“s |(some)。*(text)|\11\2 |“
,然后你得到了
\11
而不是
\1
,所以匹配值是错误的。

有一个肮脏的技巧,在大多数情况下确实有效:只需在单引号中结束字符串,插入bash变量,然后重新启动单引号字符串。重要的是不要在这三个部分之间插入任何空格,如以下示例所示:

#! /bin/bash

array=(1 2 3 4 5 6)

for i in "${array[@]}"; do
    # doesn't work
    echo "some text" | perl -pe 's|(some).*(text)|${1}'$i'${2}|'
done

请注意,我必须将\1替换为${1},否则perl会将其解释为\11、\12等。

是否尝试在regexp周围使用双引号?单引号不能扩展变量。就是这样!谢谢。perl部分应该是:
perl-pe“s |(some)。*(text)|${1}$i\2 |“