如何使用grep或awk在字符串和变量之间进行打印

时间:2016-07-22 19:59:49

标签: bash awk sed

使用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的值

编辑:问题澄清

2 个答案:

答案 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

现在结果将存储在临时文件中。