Grep perl sintaxe e caráter de copyright

3

Estou tentando extrair alguns links do texto que baixei da internet usando o grep, mas continuo recebendo "Aborted (core dumped)". Ao usar o grep, costumo usar -P , pois prefiro usar a sintaxe perl (e gosto de evitar a ganância usando ? ). O próprio grep não tem problemas em aplicar um padrão ao arquivo sem -P .

Agora, sou relativamente novo na linha de comando (e estou adorando!), então não posso resolver como resolver isso.

Observe que esse problema ocorre com quase qualquer padrão. Exemplo: grep '\.jpg' file.txt -oP

Gostaria de executar: grep '.+?\.jpg' file.txt -oP

Atualização: parece que a raiz do problema é de fato essa parte do "código":

    <script type="text/javascript">

/***********************************************
* Bookmark site script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/

/* Modified to support Opera */
function bookmarksite(title,url){
if (window.sidebar) // firefox
    window.sidebar.addPanel(title, url, "");
else if(window.opera && window.print){ // opera
    var elem = document.createElement('a');
    elem.setAttribute('href',url);
    elem.setAttribute('title',title);
    elem.setAttribute('rel','sidebar');
    elem.click();
} 
else if(document.all)// ie
    window.external.AddFavorite(url, title);
}
</script>

source: link
Eu assumi primeiro que o "*" estava causando problemas. O teste indica que o símbolo de direitos autorais era de fato o problema. É possível que isso seja um problema com diferentes codificações? Mesmo copiar e colar em um novo documento causa os mesmos problemas.

Meu ambiente é: "Cygwin, Windows 8.1 64bit" Saída de local:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

Versão do Grep:

  $ grep --version
grep (GNU grep) 2.14.56-1e3d
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
    
por Sam 03.01.2014 / 03:49

1 resposta

3

Eu não tenho acesso a um sistema cygwin, então não posso testar isso, mas como você quer usar regexes Perl, por que não usar o Perl?

perl -ne 'print "$_\n" for /.+?\.jpg/g;' file.txt 

ou

awk '{for(i=1;i<=NF;i++){if($(i)~/.+?\.jpg/){print $(i)}}}' file.txt 

No entanto, suspeito que você queira corresponder a string mais curta de caracteres que não são espaços em branco que terminam em .jpg , o que não corresponde a essa regex (embora a solução awk funcione de qualquer maneira, pois os campos são divididos em espaço em branco ). Você pode querer executar isso:

perl -ne '@a=/[^\s]+\.jpg/g; print "$_\n" for @a' file.txt 

ou

awk '{for(i=1;i<=NF;i++){if($(i)~/.+?\.jpg/){print $(i)}}}' file.txt 

ou, simples grep :

grep -o '[^[:space:]]*.jpg' file.txt        
    
por 03.01.2014 / 05:03

Tags