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