使用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">
使用'的sed -n “/ <项/,/ $ FIRSTLINE/P”' – anubhava
时我执行'FIRSTLINE = <项的rdf:about = “https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1977”'时,收到错误消息“-ksh:项目:无法打开[没有这样的文件或目录]“。 'bash'有什么不同?祝你们好运。 – shellter
我也注意到,我得到以下错误 sed:-e表达式#1,字符35:未知的命令:'/' – animoe