2016-07-22 15 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 

結果將在臨時文件存儲。