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

时间:2013-10-14 22:54:23

标签: regex linux bash shell

我正在尝试使用正则表达式从ls -l中删除权限。这就是我正在尝试的内容:

ls -l | sed '/^.([rwx]{9}) //'

它没有用,我不确定为什么?

3 个答案:

答案 0 :(得分:5)

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

所以在linux上,你可以写:

ls -l | sed -r 's/^.[-rwx]{9} //'

[注1]

但使用标准cut实用程序

来实现这一目标要容易得多
ls -l | cut -c12-

打印从第12个字符开始的每一行的字符。

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

ls -l | cut -d' ' -f2-

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

答案 1 :(得分:2)

对于这些情况,我喜欢将cut与字段分隔符一起使用。

ls -l | cut -d ' ' -f2-

BASH唯一的解决方案总是很好。

while read _ line; do echo $line; done < <(ls -l)

awk

ls -l | awk '{print substr($0, index($0,$2))}'

ruby

ls -l | ruby -ane 'puts $F[1..$F.count].join(" ")'

每个都从第二个字段开始打印每一行。

答案 2 :(得分:1)

尝试使用'cut'命令。

ls -l |cut -d ' ' -f2-

-d指定使用的字段分隔符。这是一个“空间”。 2之后-f指定以第二列开始。 ' - 'inicates,直到最后一行。