Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在两个模式之间查找字符串时,如何在sed中使用环境变量?_Bash_Sed - Fatal编程技术网

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

Bash 在两个模式之间查找字符串时,如何在sed中使用环境变量?,bash,sed,Bash,Sed,我试图找到一种方法来找到两种模式之间的所有字符串。这很简单: cat file | sed -n "/pattern_start/,/pattern_end/p" 但是,在本例中,我希望在sed脚本中使用一个变量,这也很好: cat file | sed -n "/$var1/,/pattern_end/p" 但是,如果变量包含特殊转义字符,如“/”,则此操作无效。然后我读到可以将转义字符替换为任何字符,例如#或| 例如,假设: var1=/some/funny/pa

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

    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网站上找不到任何其他问题来解决这个问题。

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

sed -n '\!'"$var1"'!,\!'"$var2"'!p' inpu
您可以这样做:

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

sed-n“/$(sed的#/#\/#g'不要对此使用
cat
命令。
var1
变量的值是多少?请为我们显示您的文件。可能重复的请参见此处:或此处:我不想替换某些内容。这是所有示例所显示的,但不是我解释的如何处理此问题。很好的建议,但是如果变量的内容是否可以包含该分隔符?然后您可以找到一个更好的分隔符。因为您事先不知道变量的内容,所以没有“更好”的分隔符。最好选择一个分隔符,然后在输入中保护该字符。(这也是我的建议,但是)如果
$var1
包含类似
\(
或其他可以由sed解释的字符,除了分隔符?(主题外)在PHP中,有一个名为
preg_quote()
的函数可以用于此。如果有这样的功能会很好。我想bash函数可能会有所帮助(如果准备充分的话)我预测对于这个问题的每一个解决方案都会有相同的评论。对于更多的读者,perl有用于此目的的
quotemeta
函数;ruby有
Regexp.escape
;python,
re.escape
——我认为所有这些都只是转义所有非单词字符。@hek2mgl,这是一个bash函数。看起来不错<代码>[^[:alnum].
应该在大多数甚至所有(?)情况下都能工作。比我想象的要简单得多。顺便说一句,“我的”sed(GNU sed版本4.2.1)将
.
解释为
alnum
。这对其他版本的sed不安全吗?
re_escape() {
    sed 's#[^[:alnum:]_]#\\&#g' <<< "$*"
}
sed -n "/$(re_escape "$var1")/,/end/p" file