2014-06-19 43 views
1

我试图只打印包含变量$ foo的行。我试过用双引号和花括号来无济于事。在sed中将shell变量传递给正则表达式的正确方法是什么?如何将变量从bash传递到正则表达式

sed -n 's:\("${foo}".*$\):\1:p' file.txt 
+0

你确定你的问题是传递变量的结果呢?当你使用字面值时,你是否证实你有匹配? – merlin2011

+2

单引号可防止变量替换。你需要做这样的事情:'sed -n's:\('“$ {foo}”'。* $ \):\ 1:p'file.txt'。使用该行上的echo来查看(或多或少)发生了什么。 – rici

回答

6

sed如果您实际上不需要修改匹配行,则会导致过度使用。只需使用grep

grep "$foo" file.txt 
1

尝试下面的sed命令来打印含有分配给变量foo值的行。

sed -n "/$foo/p" file 
+1

对于正确的sed命令+1,对于使用错误的工具为-1。你看,没有人说''$ foo''变量不包含任何特殊字符。而且你知道如果''/''类似''​​$ foo''内部会发生什么情况。 grep解决方案没有这样的问题。 –

+0

@ Aleks-DanielJakimenko好点。 BUt op需要sed解决方案。所以我发布了它。而且如果变量包含特殊字符,那么他为什么选择sed打印相应的行。 –

+0

这就是为什么我没有downvote :)但有时人们会要求错误的东西,给他们一个答案只会让事情变得更糟。 –

0

使用单引号,你得到像

$-pattern='foo' 
$-sed 's/('$pattern'.*$)/<\1>/g' 
    fo 
    fo 
    foo 
    <foo> 
相关问题