从长输出ls w/sed中删除权限?

Who*_*ppa 0 regex linux bash shell

我试图用正则表达式删除ls -l的权限.这是我正在尝试:

ls -l | sed '/^.([rwx]{9}) //'
Run Code Online (Sandbox Code Playgroud)

它不起作用,我不知道为什么?

ric*_*ici 5

Posix sed只允许"基本"正则表达式,不包括{n,m}重复语法(以及其他内容).sed与大多数Linux发行版一起分发的GNU版本,如果将其与-r选项一起使用,则启用"扩展"(即正常)正则表达式.BSD sed(例如,在Mac OS X上)使用该-E标志用于此目的.

所以在linux上,你可以写:

ls -l | sed -r 's/^.[-rwx]{9} //'
Run Code Online (Sandbox Code Playgroud)

[注1]

但使用标准cut实用程序执行此操作会更容易:

ls -l | cut -c12-
Run Code Online (Sandbox Code Playgroud)

它打印从字符编号12开始的每行的字符.

或者,由于Posix允许ls -l列表的第一个字段为11个字符而不是10个,您可以使用cut空格字符作为分隔符来输出以第二个字符开头的所有字段(这需要指定,因为cut默认分隔符是标签):

ls -l | cut -d' ' -f2-
Run Code Online (Sandbox Code Playgroud)

[1]这个正则表达式太严格了:它将无法匹配setuid/setgid可执行文件,限制删除目录(如/tmp- )和一些异常的模式.更准确的可能是^.[-rwxsStT]{9}^.([-r][-w][-xsStT]){3}.但请注意,Posix允许每个组中的三个字符中的最后一个字符为其他字符,并且还允许在模式组的末尾添加额外的"备用访问方法标志".