如何在正则表达式中使用变量?

时间:2013-03-26 15:22:57

标签: regex linux perl bash

如何在此命令中将regex替换为$var

echo "$many_lines" | sed -n '/regex/{g;1!p;};h'

$var可能看起来像fs2@auto-17

sed命令将在正则表达式之前输出该行,但不包含包含正则表达式的行。

如果使用Perl单线程可以更轻松地完成所有这些操作,那么我就可以了。

5 个答案:

答案 0 :(得分:1)

这不是很漂亮,但是这给了我$var的前一行,这是我想要的。

echo "$many_lines" | grep -B1 "$var" | grep -v "$var"

答案 1 :(得分:1)

在Perl正则表达式中,您可以将变量内容插入到/$foo/等正则表达式中。但是,内容将被解释为模式。如果要匹配$foo的文字内容,则必须转义元字符:$safe = quotemeta $foo; /$safe/。这可以缩短为/\Q$foo\E/,这是您通常想要的。尾随\E是可选的。

我不知道sed正则表达式引擎是否具有类似功能。

Perl one-liner:perl -ne'$var = "..."; print $p if /\Q$var/; $p=$_'

答案 2 :(得分:0)

使用双引号而不是单引号来允许变量扩展:

echo $many_lines | sed -n "/$var/"'{g;1!p;};h'

答案 3 :(得分:0)

因为你在正则表达式之前寻找一条线,只用一个衬垫就不会那么琐碎和漂亮,但这是我将如何做到的(仅使用Perl):

echo "$many_lines" | perl -nle 'print $. if /\Q$var/' | while read line_no; do     export line_no
    echo $many_lines | perl -nle 'print if $. - 1 == $ENV{line_no}'
done

或者如果你想在一行中做

echo "$many_lines" | perl -nle 'BEGIN {my $content = ""; } $content .= $_; END { while ($content =~ m#([^\n]+)\n[^\n]+\Q$var#gosm) { print $1 }}'

或者这个,绝对应该匹配:

echo "$many_lines" | perl -nle 'BEGIN {my @contents; } push @contents, $_; if ($contents[-1] =~ m#\Q$var#o)') { print $contents[-2] if defined $contents[-2]; }

答案 4 :(得分:-1)

或者你也可以使用here-documents,如果你不想逃避双引号!

在Perl中它看起来像这样:

$heredoc = <<HEREDOC;
  here is your text and $var is your parameter
HEREDOC

用你开始的同一个字符串来结束heredoc是非常重要的,在我的例子中它是一个新的“HEREDOC”!