我正在尝试使用正则表达式从ls -l中删除权限。这就是我正在尝试的内容:
ls -l | sed '/^.([rwx]{9}) //'
它没有用,我不确定为什么?
答案 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,直到最后一行。