Egrep voltar referência não está funcionando

1

Eu tenho tentando voltar atrás o primeiro grupo capturado no comando abaixo:

$ ls -lR | egrep 'd(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s))(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s))---'
drwxr-s--- 2 s9akhtar s9akhtar 4096 Feb 25 11:53 dir1
dr-xrws--- 2 s9akhtar s9akhtar 4096 Feb 25 11:53 dir2
dr-xrws--- 2 s9akhtar s9akhtar 4096 Feb 25 11:53 dir3
drwxrws--- 2 s9akhtar s9akhtar 4096 Feb 25 11:53 dir4
drwxrws--- 4 s9akhtar s9akhtar 4096 Feb 25 11:55 subdir
drwxrws--- 2 s9akhtar s9akhtar 4096 Feb 25 11:54 dir5
drwxrws--- 2 s9akhtar s9akhtar 4096 Feb 25 11:54 dir6

Então, quero fazer algo assim:

 ls -lR | egrep "d(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s))---"

mas aparece vazio

Como é que a referência de trás do primeiro grupo capturado, o grande suporte não funciona:

(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s))
    
por Saad A 25.02.2016 / 20:40

2 respostas

1

Se você quiser repetir o padrão , precisará usar um sufixo de contagem de {2} em vez de , que em vez disso repete a string que o primeiro padrão correspondeu . Experimente:

egrep '^d(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s)){2}---'

que você pode simplificar para:

egrep '^d(r[w-][xs-]|-w[xs-]|--[xs]){2}---'
    
por 25.02.2016 / 21:21
1

Esse é um regex impenetrável. Espero que esteja bem documentado para a próxima seiva pobre que tem que mantê-lo.

Você pode querer fazer coisas com as permissões numéricas:

find . -type d -printf "%m %p\n" | filter somehow based on the permissions
    
por 27.02.2016 / 21:10