Por que não preciso escapar de uma classe de caracteres no sed mas preciso fugir do resto?

2

Estou confuso com o sed.
Eu tinha um arquivo com o seguinte conteúdo:

[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 273667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 273687  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 272667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 373667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 573667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 263667  

Eu queria remover tudo, exceto o ID do cliente. Então eu corro o seguinte:

$ sed 's/^.*:\s\(\[0-9\]\{6\}\)//g' customers.txt > customers2.txt  

Isso não fez absolutamente nada.
Depois de pensar sobre isso (e muita frustração), tentei remover as fugas do [] . Então eu corro o seguinte:

$ sed 's/^.*:\s\([0-9]\{6\}\)//g' customers.txt > customers2.txt    

Isso funcionou.
Mas agora eu não consigo entender como funciona o sed. Por que preciso escapar de ( para agrupamento e { para intervalo, mas não [ para a classe de caractere?

    
por Jim 10.02.2014 / 22:35

2 respostas

5

Basicamente, porque [ ] faz parte da sintaxe da expressão regular básica, enquanto os grupos de captura e {} não são. Escapar de [] significa que você deseja corresponder a um colchete literal, não a uma classe.

Como um aparte, se o que você deseja é imprimir o último campo em um arquivo, awk é muito mais fácil:

awk '{print $NF}' customers.txt > customers2.txt    

No seu caso particular, você também pode usar cut :

cut -d':' -f 4 customers.txt > customers2.txt    

e você pode sempre usar o Perl:

perl -pe 's/.*:\s*//' customers.txt 
    
por 10.02.2014 / 22:40
3

Por razões históricas. Na primeira versão do Unix , apenas os caracteres \[.*^$ tinham um significado especial nas expressões regulares . Quando novos recursos foram adicionados (opção \? , repetir pelo menos uma vez \+ , repetir contagem \{…\} , grupos \(…\) , alternação \| ), eles não poderiam tornar os caracteres ({| especial porque teriam compatibilidade quebrada com scripts existentes que usavam esses caracteres literalmente. Portanto, as expressões regulares básicas e as ferramentas que se baseiam nelas usavam barras invertidas + combinações de caracteres que não estavam sendo usadas no momento.

Expressões regulares estendidas quebraram a compatibilidade no interesse de uma sintaxe consistente.

    
por 11.02.2014 / 09:17