我将展示一个例子来解释我的问题。
VARIABLE='some string'
我想在文件中搜索字符串,如:
sed -n "/$VARIABLE,test/p" aFile
我知道这是错的,因为变量标识符“$”与perl模式$冲突,这意味着行的结束。
所以我的问题是:有没有办法在sed模式搜索中使用变量?
答案 0 :(得分:4)
看起来您正在尝试使用sed
范围表示法,即/ start /,/ end /?。这是对的吗?
如果是这样,你需要做的就是添加缺少的额外'/'字符,即
sed -n "/$VARIABLE/,/test/p" aFile
范围可以由行号,字符串/正则表达式和/或相对行号组成(没有负向回看)。
sed -n "1,20p" aFile
# prints lines 1-20
sed -n '/start/,/end/p' aFile
# prints any text (include current line)
# with start until it finds the word end
sed -n '/start/,+2p' aFile
# prints line matching start and 2 more lines after it
我使用/regex/
模式中的字符串来简化解释。
当你了解它们时,你可以像/^[A-Za-z_][A-Za-z0-9_]*/
等那样做真正的rex-ex。
同样根据你对'$'的评论,sed还会使用'$'作为'行尾'的指标,如果该字符在正在评估的reg-ex中可见。另请注意我的一些示例如何使用dbl-quotes或单引号。单引号表示您的表达式sed -n '/$VARIABLE/,/test/p' aFile
与文字字符AND匹配,因为$不在reg-ex的末尾,它将用作常规字符。 '$'仅适用于行尾,当它在reg-ex(部分)的末尾时;例如,你可以做/start$|start2$/
,这两个都表示行尾。
正如其他人所指出的,你使用
sed -n "/$VARIABLE/,/test/p" aFile
正通过shell变量解释转换为
sed -n "/some text/,/test/p" aFile
所以如果你想确保你的文字固定在行尾,你可以写
sed -n "/$VARIABLE$/,/test/p" aFile
扩展为
sed -n "/some text$/,/test/p" aFile
我希望这会有所帮助