在两个模式之间查找字符串时如何在sed中使用环境变量?

时间:2014-05-21 11:41:30

标签: bash sed

我正试图找到一种方法来查找两种模式之间的所有字符串。这很简单:

    cat file | sed -n "/pattern_start/,/pattern_end/p"

但是,在这种情况下,我想在sed脚本中使用一个变量,这也没关系:

    cat file | sed -n "/$var1/,/pattern_end/p"

但是,如果变量包含特殊的转义字符,例如,' /'这不起作用。然后我读到可以将转义字符替换为任何内容,例如#或|

例如,让我们说:

    var1=/some/funny/path
    cat file | sed -n "#$var1#,#pattern_end#p"

但这对我不起作用。我究竟做错了什么?我试图在Google等上找到答案,但没有成功,我无法在Stackoverflow上找到任何其他问题来处理这个确切的问题。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

sed -n "/$(sed 's#/#\\/#g' <<< "$var1")/,/end/p" file

您必须保护变量的内容不受您选择的分隔符的影响。


为解决hek2mgl的问题,我们可以逃避所有可能有问题的角色:

re_escape() {
    sed 's#[^[:alnum:]_]#\\&#g' <<< "$*"
}
sed -n "/$(re_escape "$var1")/,/end/p" file

答案 1 :(得分:2)

要更改分隔符,您需要转义第一个分隔符,例如\!FIND!。此外,最好使用单引号,在需要时保留它们并使用双引号进行变量插值。然后您的命令如下所示:

sed -n '\!'"$var1"'!,\!'"$var2"'!p' inpu