Tem sed echo string após a partida

Tem sed echo string após a partida

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.

informação relacionada