Ich habe viele Dateien in einer Verzeichnisstruktur. Ich möchte mithilfe eines regulären Ausdrucks einige Zeichenfolgen (nämlich URLs) aus diesen Dateien extrahieren.
Ich habe Folgendes versucht:
find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt
... aber es funktioniert nicht wie erwartet. Der find
Teil funktioniert ok, der xargs
eine ok, aber der sed
eine nicht. Alles, was ich in urls.txt bekomme, ist die Verkettung aller Dateien.
Antwort1
Mit demselben find
Befehl werden die URLs zurückgegeben, die dem regulären Ausdruck entsprechen:
find . -path "*alder/ * / * .html" -exec grep -oh "http://[^'\"]*" {} +
Im Gegensatz find...-print | xargs command...
zu funktioniert dieser Ansatz bei Dateien, deren Namen Leerzeichen oder andere schwierige Zeichen enthalten
Die -o
Option „ grep
to“ gibt an, dass nur der übereinstimmende Teil zurückgegeben werden soll, nicht die Zeile, in der sich die Übereinstimmung befindet. „to“ -h
gibt an, dass das Drucken der Dateinamen, in denen die Übereinstimmungen gefunden wurden, weggelassen werden soll.
Der find
Befehl im OP findet nur Dateien, deren Namen Leerzeichen im Pfad enthalten. Da ich vermute, dass dies nicht das ist, was Sie wollen, ist hier eine alternative Form des find
Befehls, die alle Dateien in beliebiger Tiefe unter den Unterverzeichnissen des aktuellen Verzeichnisses findet .html
, deren Namen mit enden alder
:
find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +
Robusterer Ansatz
Zum Schutz vor anderen Arten von fehlerhaften html
Dateien empfiehlt cas, Leerzeichen oder >
auch das Ende einer URL zuzulassen und außerdem Folgendes zu https
akzeptieren http
:
find . -path "*alder/ * / * .html" -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +
Antwort2
Danke für all die schnellen Antworten. Entschuldigen Sie die zusätzlichen Leerzeichen im Pfad, aber wenn Sie diese entfernen, wird der Pfad beim Versuch, hier zu posten, seltsam.
Ich wollte sed verwenden, denn grep ist bei mehr als 1,2 GB und 25.000 Dateien wirklich sehr, sehr langsam.
Ich habe eine Antwort gefunden. Ein erster sed-Befehl, um die Dateien mit "'= Zeichen zu zerhacken, und dann ein zweiter sed-Befehl, um die Zeilen auszudrucken. Hier ist sie:
finden . -Pfad "*alder.com/ * / * .html" -print| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt