2016-07-22 44 views
-1

什么是正确的使用方法与打印awk或者sed为字符串和可变输出之间的文本?如何使用grep或awk的字符串和可变

这似乎并不工作

firstline=<item rdf:about="https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977" 

wget -qO- https://nvd.nist.gov/download/nvd-rss-analyzed.xml | sed -n '/<item /,/"$firstline"/p' > output 

$ FIRSTLINE拥有以前的wget的值取

编辑:问题澄清

+0

使用'的sed -n “/ <项/,/ $ FIRSTLINE/P”' – anubhava

+0

时我执行'FIRSTLINE = <项的rdf:about = “https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977”'时,收到错误消息“-ksh:项目:无法打开[没有这样的文件或目录]“。 'bash'有什么不同?祝你们好运。 – shellter

+0

我也注意到,我得到以下错误 sed:-e表达式#1,字符35:未知的命令:'/' – animoe

回答

1

使用sed的这种方式是不正确的,的sed不反对pattern space重新匹配第二个地址(简单地说,只是当前行,如果你不坚持hold space,然后去pattern space),其匹配第一个地址

第一个地址是<item和所述第二地址与<item ..启动。所以即使你逃过了第二个地址中的特殊字符,你也永远不会匹配第二个地址。

使用行号来选择内容:

$ wget -qO- https://nvd.nist.gov/download/nvd-rss-analyzed.xml > result 
$ firstline="<item rdf:about=\"https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977\"" 
$ echo $firstline 
<item rdf:about="https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977" 
$ start=$(grep -n "<item " result | head -n1 | awk -F\: '{print $1}') 
$ end=$(grep -n "$(echo $firstline | sed 's/\//\\&/g')" result | awk -F\: '{print $1}') 
echo $start $end 
169 187 
$ sed -n "$start,${end}p" result > output 

使用两个不会忽略的另一种方法:

$ wget -qO- https://nvd.nist.gov/download/nvd-rss-analyzed.xml > result 
$ firstline="<item rdf:about=\"https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977\"" 
$ firstline=$(echo $firstline | sed 's/\//\\&/g') 
$ cat result | sed -n "/<item /,\${p; /$firstline/q;}" 
    <item rdf:about="https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-3701"> 
    ... 
    <item rdf:about="https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977"> 
+0

谢谢,这解决了我的问题 – animoe

0

我猜你想在sed使用shell变量。只需使用双引号而不是单引号。

你遇到的错误,你应该使用反斜杠将其转换。此外,遇到的错误需要您在每行的末尾添加反斜杠。现在

wget xxxxx|sed 's/$/&\\/g' >temp 
sed -i "/<item /,/$firstline/p" temp 

结果将在临时文件存储。