我试图只打印包含变量$ foo的行。我试过用双引号和花括号来无济于事。在sed中将shell变量传递给正则表达式的正确方法是什么?如何将变量从bash传递到正则表达式
sed -n 's:\("${foo}".*$\):\1:p' file.txt
我试图只打印包含变量$ foo的行。我试过用双引号和花括号来无济于事。在sed中将shell变量传递给正则表达式的正确方法是什么?如何将变量从bash传递到正则表达式
sed -n 's:\("${foo}".*$\):\1:p' file.txt
sed
如果您实际上不需要修改匹配行,则会导致过度使用。只需使用grep
:
grep "$foo" file.txt
尝试下面的sed命令来打印含有分配给变量foo
值的行。
sed -n "/$foo/p" file
对于正确的sed命令+1,对于使用错误的工具为-1。你看,没有人说''$ foo''变量不包含任何特殊字符。而且你知道如果''/''类似''$ foo''内部会发生什么情况。 grep解决方案没有这样的问题。 –
@ Aleks-DanielJakimenko好点。 BUt op需要sed解决方案。所以我发布了它。而且如果变量包含特殊字符,那么他为什么选择sed打印相应的行。 –
这就是为什么我没有downvote :)但有时人们会要求错误的东西,给他们一个答案只会让事情变得更糟。 –
使用单引号,你得到像
$-pattern='foo'
$-sed 's/('$pattern'.*$)/<\1>/g'
fo
fo
foo
<foo>
你确定你的问题是传递变量的结果呢?当你使用字面值时,你是否证实你有匹配? – merlin2011
单引号可防止变量替换。你需要做这样的事情:'sed -n's:\('“$ {foo}”'。* $ \):\ 1:p'file.txt'。使用该行上的echo来查看(或多或少)发生了什么。 – rici