2017-08-27 1 views
1

Ich möchte den Verzeichnispfad mit Ausnahme des Dateinamens mit sed aus einer HTML-Datei löschen. Der Pfad wie folgt aussieht:sed mit echo verwenden und aus einer Datei lesen

<a href="/dir1/dir2/file.mp3" other_tags_here </a> 

mit Leerzeichen (%) und anderen Zeichen in den Verzeichnis- und Dateinamen. z.B.

<a href="/1-%one%2026/two%20_three%four/1-%eight.mp3" 

Ich muss nur <a href="1-%eight.mp3" other_tags_here <a/> halten. Wenn ich versuche

echo '<a href=/1-%one%2026/two%20_three%four/1-%eight.mp3' | sed 's|href="/.*/.*/|href="|g' 

funktioniert es gut. Allerdings, wenn ich aus der HTML-Datei lesen

sed 's|href="/.*/.*/|href="|g' file.html 

es löscht alles, was nach href= und gibt nur href=. Wie korrigiere ich das?

Antwort

2

In sed passen Regexes zu der am weitesten links stehenden Übereinstimmung. Das bedeutet, dass der letzte .*/ in Ihrem Regex mit dem endgültigen / auf der Linie übereinstimmen wird. Um zu verhindern, dass:

sed 's|href="/[^/]*/[^/]*/|href="|g' file.html 

Die Regex [^/]*/ nur auf die nächste / übereinstimmen.

In Sprachen wie Python oder Perl können wir dieses Problem mit nicht-gierigen Regexen beheben. Da sed nicht-gierige Regexes nicht unterstützt, müssen wir versuchen, einen ähnlichen Effekt mit Tricks wie [^/]*/ zu erreichen.

Standard Warnung: Im Allgemeinen kann HTML-Format sehr komplex sein mit vielen speziellen Fällen, dass Regexe schlecht geeignet sind, zu handhaben. Wenn Sie mit html arbeiten, ist es am besten, html-spezifische Werkzeuge zu verwenden (wie pythons beautifulsoup).

Verwandte Themen