2017-03-14 2 views
0

Ich arbeite an einer Aufgabe, für die SED das vorgesehene Werkzeug ist. Die Aufgabe besteht darin, den Inhalt einer beliebigen Webseitendatei (* .htm oder * .html) zu entfernen und die gewünschten Daten in eine neue Datei einzufügen.HTML-Inhalte mit SED löschen

  • Alles vorher und einschließlich der <body> Markierung soll entfernt werden.
  • Alles von und einschließlich der </body> Tag soll entfernt werden.

Unten ist ein Beispiel, wo <div> Tags und was zwischen ihnen ist, gehalten werden soll:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>SED Challange</title> 
</head> 
<body style="background-color:black;"><div style="width:100%; height:150px; margin-top:150px; text-align:center"> 
<img src="pic.png" width="50" height="50" alt="Pic alt text" /> 
</div></body></html> 

Aber ich habe Probleme <body> mit dem Entfernen und was kommt vor:

sed 's/.*body.*>//' ./index.html > ./index.html.nobody 

Anstelle des gewünschten Ergebnisses werden die beiden separaten Zeilen <body> und </body> entfernt!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>SED Challange</title> 
</head> 

<img src="pic.png" width="50" height="50" alt="Pic alt text" /> 

Ich kann nicht sehen, warum auch nur einer wäre. Ich freue mich über jede Rückmeldung.

Edit:

Dank SLePort, das ist mein komplettes Skript:

#!/bin/bash 

#Search location as user provided argument. 
target="$1" 

#Recursive, case insensitive search for file extension like htm(l). 
hit=$(find $target -type f -iname '*.htm' -or -iname '*.html') 

for h in $hit 
do 
    hp=$(realpath $h) #Absolute path of file (hit path). 
    echo "Stripping performed on $hp" #Informing what file(s) found. 
    nobody="${hp}_nobody" #File to contain desired data ending with "_nobody". 

    #Remove file contents from start to and including head-tag, 
    #Remove body-tag, 
    #Remove end html-tag, 
    #Removee blank lines, 
    #Insert data from file to file_nobody. 
    sed '1,/<\/head>/d;s/<\/*body[^>]*>//g;s/<\/html>//;/^$/d' $h > $nobody 
done 
+0

so sollte das Ergebnis '

Pic alt text
' sein? – RomanPerekhrest

+0

Richtig Roman, für diesen bestimmten Inhalt stimmt das. Während die Aufgabe deklariert wird, befinden sich die gewünschten Daten zwischen den BODY-Tags. Für eine andere Quelldatei sind möglicherweise keine DIV-Tags vorhanden. – henrix

Antwort

0

Dieser sed sollte mit dem Code arbeiten:

sed '1,/<\/head>/d;s/<\/*body[^>]*>//g;s/<\/html>//' ./index.html > ./index.html.nobody 

Es entfernt:

  • Linien von Linie 1 bis </head> Tag
  • <body> und </body> Tags
  • </html> tag

Schließen Aber beachten Sie, dass sed ist keine HTML-Dateien für die Analyse. Verwenden Sie stattdessen einen XML-Parser (zB: xmllint, XMLStarlet, ...)

+0

SLePort, danke für die Eingabe. Es hatte keine Wirkung für mich, fürchte ich. Ich versuche, das Skript explizit zu entfernen und einschließlich der BODY-Tag. Möglicherweise ist kein DIV-Tag in einem anderen Quellmaterial vorhanden. – henrix

+0

@henrix ich bearbeitet. Sag mir, wenn es das ist, was du willst. – SLePort

+0

Danke SLePort, ich sage du hast es geschafft! Entschuldigung für die verspätete Antwort, ich habe daran gearbeitet, das Skript zu vervollständigen. – henrix

Verwandte Themen