2016-10-28 3 views
3

Ich habe eine Liste von URLs in einer Datei (jede Zeile = andere Domain) Ich möchte (nicht rekursiv) scannen und wählen Sie zwei Muster, die in verschiedenen Zeilen sind. Nach zwei Tagen versucht - mein Kopf dreht ...grep multiline Muster

, dass der wichtige HTML-Teil ist:

<a href="http://subdomain.domain.tld/">Home</a> 
</li> 
<li> 
<a data-uv-trigger='true' href='mailto:[email protected]'> 

Ich brauche die Domain (subdomain.domain.tld) ​​und die E-Mail-Adresse wählen (john @ doe.com). Ich kann die Teile in zwei Schritten (wget/sed).

wget -O - -i urls-to-scan-manuell.txt | sed -n "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" 

wget -O - -i urls-to-scan-manuell.txt | sed -n "s/\(.*true' href='mailto\)\(.*\)\('>.*\)/\2/p" 

Aber ich mag beiden Teile auf einmal holen und schreiben sie in einer Zeile in eine Datei aus, durch ein Leerzeichen (Leerzeichen) getrennt. Es ist die Multiline-Sache mit Sed, die mich verrückt macht.

Bitte: Ich brauche Ihre Hilfe, würden Sie :)

Danke im Voraus, Rainer.

Antwort

2

Für das Protokoll: es ist not recommended to parse HTML using regex.


Sie können sed mit mehreren Ausdrücken mit -e verwenden, die hier helfen könnte:

wget -O - -i urls-to-scan-manuell.txt | sed -n \ 
    -e "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" \ 
    -e "s/\(.*true' href='mailto\)\(.*\)\('>.*\)/\2/p" 

Diese beiden Linien produzieren wird, eine für die Domain und eine für die E-Mail. Wenn Sie die Ausgabe in einer Zeile bevorzugen, können Sie eine Pipeline an paste - -. Das Standardtrennzeichen ist TAB, Sie, dass mit der -d Flagge ändern können, so zum Beispiel:

wget -O - -i urls-to-scan-manuell.txt | sed -n \ 
    -e "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" \ 
    -e "s/\(.*true' href='mailto:\)\(.*\)\('>.*\)/\2/p" | \ 
paste -d, - - 

produzieren:

http://subdomain.domain.tld/,[email protected] 

Ich habe mir die Freiheit und fügte eine : nach mailto in dem Muster, weil ich denke, das war deine Absicht.

+0

Arf, ich habe ein Rohrsymbol '|' am Ende der 'sed' und vor der' Paste' vergessen. Habe es jetzt hinzugefügt, überprüfe mein Update. – janos