Мне нужно, чтобы строка, непосредственно следующая за ней, /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, его определенно стоит изучить, если вы много сталкиваетесь с такими вещами.