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: Guilherme Gall
Subject: Re: [shell-script-pt] Regex para casar links num documento markdown
Date: Wed, 15 Mar 2023 20:29:20 -0300

Eu não conheço muito. Sempre soube que existem, mas nunca parei para
estudar direito. Como sempre me virei com o que sabia, fui postergando
o estudo das PCRE.

Tem algum material interessante para indicar?

Em ter., 14 de mar. de 2023 às 12:23, Arkanon <arkanon@lsd.org.br> escreveu:
>
> 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.
>
> _______________________________________________
> 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]