Wie grep ich mehrere @ Typen?

550
Joao

Ich verwende Linux Centos 6-64.

Wie kann ich den folgenden Befehl ändern, der nur mit @ geschriebene E-Mails in einem Eingabeordner abruft:

grep -E -o -r "[A-Za-z0-9][A-Za-z0-9._%+-]+@[A-Za-z0-9][A-Za-z0-9.-]+\.[A-Za-z]" /inputfolder/ | sort | uniq > "/outputfolder/result.txt"

E-Mails in allen folgenden @ Formaten abrufen?

info@example.com info@example.com info(at)example.com info[at]example.com info%26%23064%3Bexample.com info%40example.com 

Wenn möglich Befehl in einer einzelnen Zeile. Vielen Dank

1
Sie können Gruppen wie `(foo | bar)` anstelle des Buchstabens @ verwenden. slhck vor 5 Jahren 1
Ordentlicher Start mit der Formatierung. Downvote widerrufen Kamil Maciorowski vor 5 Jahren 0
Hallo Kamil, habe es formatiert, lass es mich wissen, wenn du es jetzt angenehmer findest. Wussten Sie übrigens, was in diesem Befehl zu aktualisieren ist? Vielen Dank Joao vor 5 Jahren 0
Hinweis: Um einen anderen Benutzer in einem Kommentar anzusprechen, lautet die Syntax @KamilMaciorowski. Bitte lesen Sie den Abschnitt "Antworten in Kommentaren" [hier] (https://superuser.com/editing-help#comment-formatting). Der Punkt ist "Hallo Kamil" sendet mir keine Benachrichtigung, aber "@Kamil" wird es tun. Kamil Maciorowski vor 5 Jahren 0
Hallo @slhck, danke für die Antwort. Ich habe @ by (foo | bar) in meinem Beispielbefehl geändert, dann hat es keine E-Mail geschrieben, nicht einmal die mit @ 's ... Joao vor 5 Jahren 0
Oh ok @ KamilMaciorowski :) Joao vor 5 Jahren 0
Ein weiterer Hinweis: Backslash am Ende einer Zeile bewirkt, dass die Shell die nächste Zeile so analysiert, als wäre sie eine Zeile. Ich habe diese Funktion beim Bearbeiten der Frage verwendet. gewöhnliche Shells sollten verstehen und die Lesbarkeit für Menschen wurde verbessert. Sie haben es wieder geändert und jetzt sieht es wieder schrecklich aus. Ich werde mich nicht um das Formatieren streiten, das ist Ihre Frage. Ich sage Ihnen nur, dass meine Bearbeitung den Befehl nicht hätte brechen dürfen. Kamil Maciorowski vor 5 Jahren 0
Joao, natürlich sollten Sie nicht `(foo | bar)` verwenden, da dies nur dann zutrifft, wenn jemand buchstäblich 'foo' oder 'bar' eingetippt hat. Das war nur ein Beispiel. Sie müssen 'foo' und 'bar' durch die entsprechenden Alternativen für das @, das Sie erfassen möchten, ersetzen. slhck vor 5 Jahren 1
Hallo @slhck, danke für die Antwort. Ich habe das @ durch Folgendes ersetzt: * (@ | (at) | [at] | @ |% 40 |% 26% 23064% 3B) * und alle außer (at) und [at] funktionieren, sollte ich noch etwas hinzufügen? Vielen Dank Joao vor 5 Jahren 0
@Kamil, wie fügst du die farbige Hintergrundformatierung in diese kleinen Kommentare wie den (foo | bar) oben mit farbigem Hintergrund ein? Joao vor 5 Jahren 0
Siehe meine letzte Bearbeitung der Frage. Solche Backticks funktionieren auch in Kommentaren. Kamil Maciorowski vor 5 Jahren 0
Hallo @Kamil, ich habe nicht bemerkt, dass du es geändert hast, es war vielleicht, als ich testete, wie man das Formatieren in der gleichen Zeit testet, in der du es auch formatiert hast. Joao vor 5 Jahren 0
OK, kein Schaden. Wenn Sie Fragen und Antworten formatieren möchten, können Sie in einem anderen, gut formatierten Beitrag auf "Bearbeiten" klicken und von anderen Benutzern erfahren, wie andere Benutzer dies getan haben (dann verwerfen Sie ggf. Ihre Änderungen). Mit Kommentaren ist es nicht so einfach, aber Sie haben [this] (https://superuser.com/editing-help#comment-formatting). "Code in Backticks" ist da. Kamil Maciorowski vor 5 Jahren 0
@Kamil ok danke. Übrigens, wissen Sie, wie ich das `(at)` und `[at]` im `(foo | bar) '- Beispiel oben in der Befehlszeile hinzufüge, das ich in` (@ | (at) | geändert habe [at] | @ |% 40 |% 26% 23064% 3B) `? Aber es ist nicht das `(at)` und `[at]`. Vielen Dank Joao vor 5 Jahren 0
`()` und `[]` haben eine spezielle Bedeutung für Regex. Ich denke, Sie müssen sie entziehen: `(@ | \ (at \) | \ [at \] | @ |% 40 |% 26% 23064% 3B)`. Kamil Maciorowski vor 5 Jahren 0
@Kamil, es grepping das `[at]` und `(at)` mit den Backslashes, verschwindet jedoch mit dem, was vor dem @ in diesen E-Mails ist, und verschwindet auch mit dem, was vor dem @ steht Joao vor 5 Jahren 0
Mögliches Duplikat von [Grep mit mehreren für den Befehl verwendeten Mustern] (https://superuser.com/questions/1112366/grep-with-multiple-patterns-used-on-the-command) phuclv vor 5 Jahren 0
@phuclv Danke für die Antwort, ich habe dein Beispiel gelesen, aber ich konnte keinen Weg finden, es hier auf meinem zu verwenden. Ich brauche jetzt nur zu wissen, wie man in diesem (foo | bar) `` [at] `und` (at) `schreibt, ohne Probleme in der Regex. Joao vor 5 Jahren 0
Sie können mehrere Formate gleichzeitig wie grep -e "format1" -e "format2" ... ` phuclv vor 5 Jahren 0

1 Antwort auf die Frage

1
Toto

Sie können das -PFlag für Perl-Regex und -ifür Groß- und Kleinschreibung nicht verwenden:

grep -Pi "[A-Z0-9][\w.%+-]+(?:@|@|\(at\)|\[at\]|%26%23064%3B|%40)[A-Z0-9][A-Z0-9.-]+\.[A-Z]" 

\w steht für [a-zA-Z0-9_]

Erläuterung:

[A-Z0-9] : 1 alphanum [\w.%+-]+ : 1 or more alphanum, _, ., %, + or - (?: : start non capture group @ : literally @ | : OR @ : html entity for @ | : \(at\) : | : \[at\] : | : %26%23064%3B : | : %40 : ) : [A-Z0-9] : 1 alphanum [A-Z0-9.-]+ : 1 or more alphanum, . or - \. : a dot [A-Z] : 2 upto 6 alpha (be aware that TLDs may have much more characters, see: https://www.iana.org/domains/root/db) 

Ergebnis für gegebenes Beispiel:

grep -Pi "[A-Z0-9][\w.%+-]+(?:@|@|\(at\)|\[at\]|%26%23064%3B|%40)[A-Z0-9][A-Z0-9.-]+\.[A-Z]" file.txt  info@example.com info@example.com info(at)example.com info[at]example.com info%26%23064%3Bexample.com info%40example.com 
@Joao: Sie müssen `-or`-Optionen hinzufügen, damit es zu 'grep -Pior ....` wird, wenn Sie alle Dateien rekursiv grepen und nur den übereinstimmenden Teil ausgeben möchten. Toto vor 5 Jahren 1