Habe sed echo string nach match

Habe sed echo string nach match

Ich muss die Zeichenfolge direkt danach /pbs.twimg.com\/profile_images\/als Echo ausgeben. Dies ist für ein Suchtool, das ich mit etwas Hilfe erstellt habe, und jeder empfiehltsed, aber ich benutze es nie wirklichsedalso ich verstehe es nicht so richtig. Aber hier ist das Skript:

read -r Username ;\
wget -q -O - https://twitter.com/"${Username}" | \
 sed -n '/data-screen-name=.'"${Username}"'".*data-user-id=/I \
    {s/^.*data-screen-name=.'"${Username}"'".*data-user-id="\([0-9]*\)".*$/\1/Ip;q}'

Dieses Skript funktioniert für die meisten Konten einwandfrei, aber wenn das Konto privat ist, schlägt es fehl. Wenn es stattdessen nach sucht, /pbs.twimg.com\/profile_images\/wird nur die ID angezeigt und es werden keine unterschiedlichen Variablen angezeigt, wie dies im ursprünglichen Skript der Fall ist (deshalb wählt es die Zeile mit data-screem-name=Ich kann das nicht verwendentwitterAPI, weil ich dies für Leute exportiere, die nicht einmal wissen, wie sie an die API kommen, und deshalb versuche ich, es für den Benutzer so einfach wie möglich zu machen.

Ich habe mir mehrere SO/SE-Beiträge angesehen und glaube nicht, dass es sich hierbei um ein Duplikat handelt. Sollte dies der Fall sein, entschuldigen Sie bitte.

EDIT---- Dies funktioniert nicht bei privaten Profilen, da die Zeile, zu der es führt, nicht im HTML enthalten ist. Nachdem ich weiter nachgesehen hatte, bemerkte ich, dass dies /pbs.twimg.com\/profile_images\/die ID des Benutzers angibt und sowohl bei privaten als auch bei offenen Konten vorhanden ist.

Beispieldaten:
Wenn ich dies jetzt auf meinem Konto ausführen würde, würde es funktionieren und Sie würden meine ID sehen:

Username="thematrix1o1"
717835108540030976

Aber wenn ich es auf einem privaten Konto ausführe, erhalte ich keine ID (weil die Zeile nicht vorhanden ist).

Username="touchmytweets"
.

(im Bericht ist kein Punkt, er ist einfach leer)

Hier ist das Bild mit dem, was ich finden musshttps://i.stack.imgur.com/WSACJ.jpg Wie Sie sehen können, lautet ihre ID:726618076633030656
Kleiner Beispielbericht
ile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/418265825\/1463628965","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":n

Antwort1

Ihre Ausgabe enthält eine beliebige Menge zufälligen Mülls und eine Zeile, die Sie interessiert. Wählen Sie diese Zeile aus, verwerfen Sie alles außer der ID und drucken Sie das Ergebnis:

 sed -n '/profile_images/s/.*profile_images\\\/\([0-9]\+\).*/\1/p'

Dies könnte etwas effizienter gestaltet werden, indem man sofort nach der Verarbeitung dieser Zeile beendet.

Tatsächlich ist es ziemlich genau das, was der Originalcode macht. Das Einzige, was sich geändert hat, ist der verwendete reguläre Ausdruck.

Antwort2

Wenn ich mit einer Nadel-im-Heuhaufen-Arbeit wie dieser konfrontiert werde, mache ich daraus, wenn möglich, gerne ein zeilenorientiertes Problem. Das könnte Ihnen mit etwas wie diesem gelingen:

$ sed -E 's:[0-9]+:\n&\n:g' filename \
| grep -F -A1 '/pbs.twimg.com\/profile_images\' | tail -1 

Dadurch wird für jede Ziffernfolge eine eigene Zeile eingefügt, nach Ihrer Zeichenfolge gesucht und die nächste gedruckt.

Das ist ein ziemlicher Hack; HTML wird am besten mit einem HTML-Parser analysiert. Aber für kontrollierte Eingaben, bei denen Sie nur eine Zeichenfolge benötigen, könnte es funktionieren.

Ein etwas eleganterer Ansatz wäre die Verwendung von awk. Es lohnt sich auf jeden Fall, es zu lernen, wenn Sie viel mit solchen Dingen zu tun haben.

verwandte Informationen