Выполнить команду sed echo string после совпадения

Выполнить команду sed echo string после совпадения

Мне нужно, чтобы строка, непосредственно следующая за ней, /pbs.twimg.com\/profile_images\/была выведена эхом. Это для инструмента поиска, который я создал с небольшой помощью, и все рекомендуютсед, но я никогда не используюседтак что я не очень хорошо понимаю. Но вот сценарий:

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}'

Этот скрипт отлично работает для большинства аккаунтов, но если аккаунт частный, то он не сработает. Если он ищет вместо /pbs.twimg.com\/profile_images\/этого, то выдаст только идентификатор, и не выдаст различные переменные, как в оригинальном скрипте (вот почему он выбирает строку с data-screem-name=I can't use theтвиттерAPI, потому что я экспортирую это для людей, которые даже не знают, как получить API, и поэтому я пытаюсь сделать это максимально простым для пользователя.

Я просмотрел несколько сообщений SO/SE и не думаю, что это дубликат, так что извините, если это так.

EDIT---- Это не работает в личных профилях, потому что строка, к которой это относится, не находится внутри HTML. Пройдя дальше, я заметил, что это /pbs.twimg.com\/profile_images\/дает идентификатор пользователя и есть как в личных, так и в открытых аккаунтах.

Образец данных:
Если бы я сейчас запустил это в своей учетной записи, это бы сработало, и вы бы увидели мой идентификатор:

Username="thematrix1o1"
717835108540030976

Но если я запущу его в личном аккаунте, то не получу идентификатора (потому что там нет строки)

Username="touchmytweets"
.

(в отчете нет точки, просто пустое место)

Вот изображение того, что мне нужно найтиhttps://i.stack.imgur.com/WSACJ.jpg Как вы видите, ее удостоверение личности:726618076633030656
Небольшой пример отчета
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

решение1

Ваш вывод содержит любое количество случайного хлама и одну интересующую вас строку. Выберите эту строку, отбросьте все, кроме идентификатора, и выведите результат:

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

Это можно сделать немного эффективнее, если выйти сразу после обработки строки.

На самом деле, это почти то же самое, что делает оригинальный код. Единственное, что изменилось, — это используемое регулярное выражение.

решение2

Когда я сталкиваюсь с такой работой, как «иголка в стоге сена», я люблю превращать ее в проблему, ориентированную на линии, если могу. Вы могли бы сделать это с помощью чего-то вроде этого:

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

Это помещает любую строку цифр в отдельную строку, ищет ее и выводит следующую строку.

Это довольно хак; правильный способ парсить HTML — с помощью HTML-парсера. Но он может справиться с работой для контролируемых входов, где вам нужна только одна строка.

Немного более аккуратный подход — использовать awk, его определенно стоит изучить, если вы много сталкиваетесь с такими вещами.

Связанный контент