2016-07-22 12 views
-1

Wie kann sed oder awk verwendet werden, um Text zwischen einer Zeichenfolge und einer Variablen auszugeben?Verwendung von grep oder awk zum Drucken zwischen einer Zeichenfolge und einer Variablen

scheinen diese nicht

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 

$ Erstlinien hält ein Wert von früheren wget holen

bearbeiten zu arbeiten: Ihre Frage geklärt

+0

Verwenden 'sed -n "/ anubhava

+0

wenn Ich führe 'firstline = shellter

+0

Ich bemerkte auch, dass ich folgenden Fehler sed erhalten: -e Ausdruck # 1, char 35: unbekannt Befehl: '/ ' – animoe

Antwort

1

Mit sed auf diese Weise nicht korrekt ist, die zweite Adresse nicht erneut übereinstimmen sed nicht gegen die pattern space (einfach gesagt, nur die aktuelle Zeile, wenn Sie nicht zu hold space halten und es dann zu pattern space bekommen), dass die abgestimmt erste Adresse. Die erste Adresse ist <item und die zweite Adresse beginnt mit <item ... Sie werden also niemals die zweite Adresse finden, obwohl Sie den Sonderzeichen in der zweiten Adresse entkommen sind.

Zeilennummer Verwenden von Inhalten zu wählen:

$ 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 

Eine andere Methode unter Verwendung von zwei Adressen:

$ 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

Danke, das hat meine Frage gelöst – animoe

0

Ich denke, man Shell-Variablen in sed verwenden möchten. Verwenden Sie einfach doppelte Anführungszeichen anstelle von einfachen Anführungszeichen.

Und der Fehler, den Sie trafen, sollten Sie Backslash verwenden, um es zu konvertieren. Außerdem müssen Sie am Ende jeder Zeile einen umgekehrten Schrägstrich einfügen.

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

Jetzt wird das Ergebnis in der temporären Datei gespeichert.

Verwandte Themen