我使用sed从欲望点获取文件的内容,但我遇到了问题。
我无法在此sed命令中打印$variable
值
count=$(sed -n '/$variable/,$p' file.log | grep '"KO"' -c)
我尝试使用双引号并关闭单个但不能正常工作
count=$(sed -n "/$variable/,$p" file.log | grep '"KO"' -c)
ERROR意外`,'
count=$(sed -n '/'$variable'/,$p' file.log | grep '"KO"' -c)
ERROR未终结地址正则表达式
我知道sed研究是letteral“$ variable”但是我无法传递价值......
提前致谢。
答案 0 :(得分:2)
这是一个引用正确的问题。
你的第一个例子:
count=$(sed -n '/$variable/,$p' file.log | grep '"KO"' -c)
不展开$variable
,因为它是单引号,第二个:
count=$(sed -n "/$variable/,$p" file.log | grep '"KO"' -c)
展开$variable
,但其内容存在问题,如 choroba 所述。它还有$p
的问题,它将被解释为shell变量。你的第三个例子:
count=$(sed -n '/'$variable'/,$p' file.log | grep '"KO"' -c)
非常接近您的需求,但如果$variable
包含特别处理的字符,则仍会受到影响,因此需要对其进行转义,例如:以下作品:
variable="\[17-09-12 00:01:03\]"
count=$(sed -n '/'$variable'/,$p' file.log
由于括号对于shell也是特殊的,您可以使用printf
%q
指令自动转义它们:
variable="[17-09-12 00:01:03]"
variable=$(printf "%q" "$variable")
count=$(sed -n '/'$variable'/,$p' file.log
答案 1 :(得分:1)
[
在sed
中具有特殊含义。我会使用比sed
更强大的东西,即Perl。它可以为你逃避变量:
perl -ne '/\Q'"$variable"'\E/ and print'