shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Regex para casar links num documento markdown


From: Arkanon
Subject: Re: [shell-script-pt] Regex para casar links num documento markdown
Date: Tue, 14 Mar 2023 12:19:24 -0300

Não sei o quão íntimo você é das PCRE, Guilherme, mas as considero uma extensão maravilhosa das ERE.

O simples fato de permitirem levar em consideração uma parte da ER apenas para match mas não para referência efetiva, tanto para frente quanto para trás (lookahead e loobehind) já abre uma gama de aplicações que dificilmente eu consigo ignorar.

O problema em potencial das PCRE é o suporte ainda incompleto (no grep por ex) ou inexistente (no sed por ex) que sempre deve ser levado em consideração quando se cogita utilizá-las.

Pessoalmente, sou tão fã que não me importo nem um pouco em nivelar minhas ER no padrão PCRE, mas estou bem ciente que isso pode limitar a aplicabilidade delas fora das ferramentas que utilizo.

At.te,

(o_                          __o
//\   arkanon@lsd.org.br   _`\<,
V_/_                      (_)/(_)
---------------------------------


Em ter., 14 de mar. de 2023 às 11:16, Guilherme Gall <gmgall@gmail.com> escreveu:
Opa, parece que você matou a charada, Arkanon.

Obrigado novamente!

Eu ia demorar para pegar essa. Isso se pegasse porque, para começar,
na minha cabeça -E e -P no grep eram equivalentes.

Abraço,

Guilherme

Em ter., 14 de mar. de 2023 às 03:12, Arkanon <arkanon@lsd.org.br> escreveu:
>
> Achei!
>
> Veja a sutil diferença:
>
> pcre='\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)'
>  ere='\[[^]]+\]\(([^()]+|[^()]+\([^)]+\).*)\)'
>
> $ grep --color -noP $pcre exemplo.md
> $ grep --color -noE $ere  exemplo.md
>
> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
> 3:[Wordpress](https://wordpress.org/)
> 4:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
> 6:[Geradores de sites estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
> 7:[Jekyll](https://jekyllrb.com/)
> 7:[Hugo](https://gohugo.io/)
> 9:[contato](/contact)
>
> Obrigado pelo problema :)
>
> (o_                          __o
> //\   arkanon@lsd.org.br   _`\<,
> V_/_                      (_)/(_)
> ---------------------------------
>
>
> Em ter., 14 de mar. de 2023 às 02:57, Arkanon <arkanon@lsd.org.br> escreveu:
>>
>> Por algum motivo obscuro, se você forçar o grep a usar PCRE, a coisa funciona como imagino que você queira:
>>
>> $ grep --color -noP '\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)' exemplo.md
>> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
>> 3:[Wordpress](https://wordpress.org/)
>> 4:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
>> 6:[Geradores de sites estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
>> 7:[Jekyll](https://jekyllrb.com/)
>> 7:[Hugo](https://gohugo.io/)
>> 9:[contato](/contact)
>>
>> Só não estou identificando agora nessa ER nenhuma característica específica de PCRE que justifique não funcionar com ERE...
>>
>> (o_                          __o
>> //\   arkanon@lsd.org.br   _`\<,
>> V_/_                      (_)/(_)
>> ---------------------------------
>>
>>
>> Em seg., 13 de mar. de 2023 às 22:41, Guilherme Gall <gmgall@gmail.com> escreveu:
>>>
>>> Fala Arkanon, tudo certo?
>>>
>>> Consegui ver a formatação, sim. Muito obrigado pela resposta. :-D
>>>
>>> Realmente lá no regex101 parece que fica certinho.
>>>
>>> Só não funciona colocando ela diretamente no grep como eu conseguia
>>> fazer com a 1ª versão. Considerando o mesmo arquivo exemplo.md:
>>>
>>> --- shell ---
>>> $ grep -n -E -o '\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)' exemplo.md
>>> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system), como
>>> o [Wordpress](https://wordpress.org/). Porém, verifique se você pode
>>> instalar a pilha
>>> [LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
>>> 5:[Geradores de sites
>>> estáticos](https://en.wikipedia.org/wiki/Static_site_generator) (como
>>> o [Jekyll](https://jekyllrb.com/) ou o [Hugo](https://gohugo.io/))
>>> 7:[contato](/contact)
>>> --- fim da saída do shell ---
>>>
>>> Observe que ela casa do início do 1º link na linha até o final do
>>> último link na linha num único grupo.
>>>
>>> Na linha 3, tem 3 links que casam como um grupo só. Na linha 5 idem.
>>>
>>> Vou quebrar a cabeça um pouco por aqui com flags do grep e tentando
>>> adaptar a tua versão.
>>>
>>> Abraço,
>>>
>>> Guilherme
>>>
>>> Em seg., 13 de mar. de 2023 às 12:47, Arkanon <arkanon@lsd.org.br> escreveu:
>>> >
>>> >
>>> > Experimente essa versão:
>>> >
>>> > https://regex101.com/r/KMzhNZ/2
>>> >
>>> > A ER ficou
>>> >
>>> > \[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)
>>> >
>>> > Não sei se você verá a formatação com fundo vermelho.
>>> > Minha sugestão é considerar 2 casos:
>>> >
>>> > -----------------------------v  url's sem parênteses
>>> > \[[^]]+\]\(   (   [^()]+   |   [^(]+\([^)]+\).*   )   \)
>>> > ------------------------------------------------------^ url's com parênteses
>>> >
>>> > ISSO (não a sugestão anterior :-p) ajuda?
>>> >
>>> > Ab,
>>> >
>>> > (o_                          __o
>>> > //\   arkanon@lsd.org.br   _`\<,
>>> > V_/_                      (_)/(_)
>>> > ---------------------------------
>>> >
>>> >
>>> > Em seg., 13 de mar. de 2023 às 11:58, Guilherme Gall <gmgall@gmail.com> escreveu:
>>> >>
>>> >> Saudações, pessoal. Tudo bem?
>>> >>
>>> >> Estou quebrando a cabeça com uma regex aqui e talvez alguém veja uma
>>> >> solução que ainda não vi.
>>> >>
>>> >> Estou tentando casar todos os links em um arquivo markdown. Listarei
>>> >> um exemplo de arquivo de entrada e minha tentativa abaixo, mas caso
>>> >> fique difícil de entender, está no regex101 também:
>>> >> https://regex101.com/r/KMzhNZ/1
>>> >>
>>> >> Exemplo de arquivo:
>>> >>
>>> >> --- exemplo.md ---
>>> >> # Blogs
>>> >>
>>> >> Uma alternativa é usar um
>>> >> [CMS](https://en.wikipedia.org/wiki/Content_management_system), como o
>>> >> [Wordpress](https://wordpress.org/). Porém, verifique se você pode
>>> >> instalar a pilha
>>> >> [LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle)) por aí.
>>> >>
>>> >> [Geradores de sites
>>> >> estáticos](https://en.wikipedia.org/wiki/Static_site_generator) (como
>>> >> o [Jekyll](https://jekyllrb.com/) ou o [Hugo](https://gohugo.io/))
>>> >> também são alternativas populares.
>>> >>
>>> >> Se quiser trocar ideia comigo sobre isso, entre em [contato](/contact).
>>> >> --- fim de exemplo.md ---
>>> >>
>>> >> Minha tentativa de casamento foi:
>>> >>
>>> >> --- shell ---
>>> >> $ grep -n -E -o '\[[^]]+\]\([^)]+\)' exemplo.md
>>> >> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
>>> >> 3:[Wordpress](https://wordpress.org/)
>>> >> 3:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle)
>>> >> 5:[Geradores de sites
>>> >> estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
>>> >> 5:[Jekyll](https://jekyllrb.com/)
>>> >> 5:[Hugo](https://gohugo.io/)
>>> >> 7:[contato](/contact)
>>> >> --- fim da saída do shell ---
>>> >>
>>> >> Um link no markdown tem o formato [texto do link](url), então minha
>>> >> lógica foi casar:
>>> >>
>>> >> - um "abre colchetes" literal seguido de
>>> >> - ao menos um caractere que não seja um "fecha colchetes" seguido de
>>> >> - um "fecha colchetes" literal seguido de
>>> >> - um "abre parênteses" literal seguido de
>>> >> - ao menos um caractere que não seja um "fecha parênteses" seguido de
>>> >> - um "fecha parênteses"
>>> >>
>>> >> Isso **quase** funciona. O link em que não funciona é o para a URL
>>> >> https://en.wikipedia.org/wiki/LAMP_(software_bundle) que possui
>>> >> parênteses.
>>> >>
>>> >> Toda tentativa de fazer o link acima casar, só acabou com uma regex
>>> >> mais difícil de entender e que casava errado o link para
>>> >> https://gohugo.io/, pegando inadvertidamente o "fecha parênteses" do
>>> >> texto (além do do link).
>>> >>
>>> >> Virou uma situação em que quando eu acertava o casamento para o link
>>> >> de texto "LAMP", eu quebrava o casamento para o link de texto "Hugo" e
>>> >> vice-versa.
>>> >>
>>> >> Alguma ideia?
>>> >>
>>> >> Grato desde já,
>>> >>
>>> >> Guilherme
>>> >>
>>> >> _______________________________________________
>>> >> Lista brasileira de usuários de shell script
>>> >> Endereço de e-mail da lista: shell-script-pt@nongnu.org
>>> >> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>>> >> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>>> >>
>>> >> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>>> >
>>> > _______________________________________________
>>> > Lista brasileira de usuários de shell script
>>> > Endereço de e-mail da lista: shell-script-pt@nongnu.org
>>> > Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>>> > Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>>> >
>>> > NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>>>
>>> _______________________________________________
>>> Lista brasileira de usuários de shell script
>>> Endereço de e-mail da lista: shell-script-pt@nongnu.org
>>> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>>> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>>>
>>> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>
> _______________________________________________
> Lista brasileira de usuários de shell script
> Endereço de e-mail da lista: shell-script-pt@nongnu.org
> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>
> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.

_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]