2016-07-22 36 views
-1

sedまたはawkを使用して文字列と変数の間にテキストを出力する正しい方法はありますか?文字列と変数の間に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 

$のファーストラインは、前のwgetのからの値が

編集をフェッチ保持動作していないよう:質問は、私はあなたがsedの中でシェル変数を使用したいと思います

+0

'sedの-n "/ <項目/、/ $ファーストライン/ P" を使用して' – anubhava

+0

私は 'firstline = shellter

+0

次のエラーが発生したことに気づきました sed:-e式#1、char 35:unknownコマンド:// – animoe

答えて

1

sedはこの方法を使用すると、が一致したことをpattern spaceに対する再一致していない2番目のアドレス(あなたがhold spaceに保持し、その後pattern spaceにそれを取得しない場合は単純に現在の行を言った)はsedを、正しくありません最初のアドレス

最初のアドレスは<itemで、2番目のアドレスは<item ..で始まります。したがって、2番目のアドレスの特殊文字をエスケープしても、2番目のアドレスは決して一致しません。コンテンツを選択するために行番号を使用して

$ 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 

2人の住所が使用する別の方法:

$ 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

を明らかにしました。一重引用符の代わりに二重引用符を使用してください。

エラーが発生したため、バックスラッシュを使用して変換してください。また、あなたが会ったエラーは、各行の最後にバックスラッシュを追加する必要があります。

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

これで結果は一時ファイルに保存されます。

関連する問題