Wie drucke ich Zeilen mit Find und Sed in mehreren Dateien?

Wie drucke ich Zeilen mit Find und Sed in mehreren Dateien?

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 findTeil funktioniert ok, der xargseine ok, aber der sedeine nicht. Alles, was ich in urls.txt bekomme, ist die Verkettung aller Dateien.

Antwort1

Mit demselben findBefehl 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 -oOption „ grepto“ gibt an, dass nur der übereinstimmende Teil zurückgegeben werden soll, nicht die Zeile, in der sich die Übereinstimmung befindet. „to“ -hgibt an, dass das Drucken der Dateinamen, in denen die Übereinstimmungen gefunden wurden, weggelassen werden soll.

Der findBefehl 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 findBefehls, 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 htmlDateien empfiehlt cas, Leerzeichen oder >auch das Ende einer URL zuzulassen und außerdem Folgendes zu httpsakzeptieren 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

verwandte Informationen