Eu preciso que a string seguinte /pbs.twimg.com\/profile_images\/
seja ecoada. Isto é para uma ferramenta de pesquisa que criei com um pouco de ajuda e todos recomendamsed, mas eu nunca usosedentão não entendo bem. Mas aqui está o roteiro:
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}'
Este script funciona perfeitamente para a maioria das contas, mas se a conta for privada, ela falhará. Se, em vez disso, ele pesquisar, /pbs.twimg.com\/profile_images\/
apenas o ID aparecerá e não aparecerá com variáveis diferentes como no script original (é por isso que ele seleciona a linha com data-screem-name=
I can't use theTwitterAPI porque estou exportando isso para pessoas que nem saberiam como obter a API e por isso estou tentando deixar o mais simples possível para o usuário.
Examinei vários posts SO/SE e não acredito que seja uma duplicata, desculpe se for.
EDIT---- Isso não funciona em perfis privados porque a linha para onde vai não está dentro do HTML. Depois de prosseguir, notei que /pbs.twimg.com\/profile_images\/
fornece o ID do usuário e está tanto em contas privadas quanto em contas abertas.
Dados de amostra:
No momento, se eu executasse isso em minha conta, funcionaria e você veria meu ID:
Username="thematrix1o1"
717835108540030976
Mas se eu executá-lo em uma conta privada, não receberei nenhum ID (porque a linha não está lá)
Username="touchmytweets"
.
(não há ponto no relatório, está apenas em branco)
Aqui está a imagem com o que preciso encontrarhttps://i.stack.imgur.com/WSACJ.jpg
Como você pode ver, o ID dela é:726618076633030656
Relatório de pequena amostra
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
Responder1
Sua saída contém qualquer quantidade de lixo aleatório e uma linha na qual você está interessado. Selecione essa linha, descarte qualquer coisa, exceto o ID, e imprima o resultado:
sed -n '/profile_images/s/.*profile_images\\\/\([0-9]\+\).*/\1/p'
Isso poderia ser um pouco mais eficiente encerrando-se imediatamente após o processamento da linha.
Na verdade, isso é exatamente o que o código original faz. A única coisa que mudou foi a expressão regular usada.
Responder2
Quando sou confrontado com um trabalho tipo agulha no palheiro, gosto de transformá-lo em um problema orientado por linha, se puder. Você pode fazer isso com algo assim:
$ sed -E 's:[0-9]+:\n&\n:g' filename \
| grep -F -A1 '/pbs.twimg.com\/profile_images\' | tail -1
Isso coloca qualquer string de dígito em uma linha por si só, greps para sua string e imprime a seguinte.
É um truque e tanto; a maneira correta de analisar HTML é com um analisador de HTML. Mas pode funcionar para entradas controladas onde você só precisa de uma string.
Uma abordagem um pouco mais simples seria usar o awk, definitivamente vale a pena aprender se você lida muito com essas coisas.