![Egrep 反向引用不起作用](https://linux22.com/image/84317/Egrep%20%E5%8F%8D%E5%90%91%E5%BC%95%E7%94%A8%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我尝试在下面的命令中引用第一个捕获的组:
$ 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