Egrep 反向引用不起作用

Egrep 反向引用不起作用

我尝试在下面的命令中引用第一个捕获的组:

$ 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

所以我想做这样的事情:

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

但结果是空的

为什么第一个捕获组的后向引用大括号不起作用:

(rw(x|s)|rw-|r-(x|s)|-w(x|s)|r--|-w-|--(x|s))

答案1

如果你想重复该模式您需要使用计数后缀{2}代替\1,它会重复第一个模式匹配的字符串。尝试:

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

您可以将其简化为:

egrep '^d(r[w-][xs-]|-w[xs-]|--[xs]){2}---'

答案2

这是一个难以理解的正则表达式。我希望对于下一个必须维护它的可怜的傻瓜来说,它有很好的记录。

您可能想用数字权限来做一些事情:

find . -type d -printf "%m %p\n" | filter somehow based on the permissions

相关内容