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

che*_*ila 4 shell sed

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

VARIABLE='some string'
Run Code Online (Sandbox Code Playgroud)

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

sed -n "/$VARIABLE,test/p" aFile
Run Code Online (Sandbox Code Playgroud)

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

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

she*_*ter 5

看起来您正在尝试使用sed范围符号,即/start/,/end/?。那是对的吗?

如果是这样,您需要做的就是添加缺少的附加“/”字符,即

sed -n "/$VARIABLE/,/test/p" aFile
Run Code Online (Sandbox Code Playgroud)

范围可以由行号、字符串/正则表达式和/或相对行号(没有负面回顾)组成。

 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
Run Code Online (Sandbox Code Playgroud)

我在模式中使用字符串/regex/来简化解释。/^[A-Za-z_][A-Za-z0-9_]*/ 当你了解它们时,你可以做真正的霸王龙之类的事情。

另外,根据您对“$”的评论,如果该字符在正在评估的正则表达式中可见,则 sed 还将使用“$”作为“行尾”的指示符。另请注意我的一些示例如何使用双引号或单引号。单引号意味着您的表达式sed -n '/$VARIABLE/,/test/p' aFile将与文字字符匹配,并且因为 $ 不在正则表达式的末尾,所以它将用作常规字符。'$' 仅当位于正则表达式(部分)末尾时才用作行尾;例如你可以这样做/start$|start2$/,这两者都表示行尾。

正如其他人指出的那样,您的使用

sed -n "/$VARIABLE/,/test/p" aFile
Run Code Online (Sandbox Code Playgroud)

正在通过 shell 变量解释转换为

sed -n "/some text/,/test/p" aFile
Run Code Online (Sandbox Code Playgroud)

所以如果你想确保你的文本锚定在行尾,你可以写

sed -n "/$VARIABLE$/,/test/p" aFile 
Run Code Online (Sandbox Code Playgroud)

扩展到

sed -n "/some text$/,/test/p" aFile
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

  • 最后一行不应该是 sed -n "/some text$/,/test/p" aFile 吗? (2认同)