使用sed或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 fetch的值
编辑:问题澄清
答案 0 :(得分:1)
以这种方式使用sed不正确, sed不会将第二个地址与pattern space
重新匹配(如果你不坚持{{1},则只说当前行然后将其设置为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
答案 1 :(得分:0)
我想你想在sed中使用shell变量。只需使用双引号而不是单引号。
你遇到的错误,你应该使用反斜杠来转换它。您遇到的错误也需要您在每行的末尾添加反斜杠。
wget xxxxx|sed 's/$/&\\/g' >temp
sed -i "/<item /,/$firstline/p" temp
现在结果将存储在临时文件中。