如何在sed搜索模式中使用变量

时间:2012-03-12 10:34:44

标签: shell sed

我将展示一个例子来解释我的问题。

VARIABLE='some string'

我想在文件中搜索字符串,如:

sed -n "/$VARIABLE,test/p" aFile

我知道这是错的,因为变量标识符“$”与perl模式$冲突,这意味着行的结束。

所以我的问题是:有没有办法在sed模式搜索中使用变量?

1 个答案:

答案 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

我希望这会有所帮助