0

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

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

它不工作,我不知道为什么?

4

3 回答 3

5

Posixsed只允许“基本”正则表达式,它不包括{n,m}重复语法(除其他外)。sed与大多数 linux 发行版一起分发的 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 允许每个组中三个字符中的最后一个字符是其他字符,并且还允许在模式组的末尾附加一个“备用访问方法标志”。

于 2013-10-14T23:05:29.343 回答
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(" ")'

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

于 2013-10-15T05:00:13.203 回答
1

尝试使用“剪切”命令。

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

-d 指定使用的字段分隔符。这里是一个“空间”。-f 后的 2 指定从第二列开始。'-' 表示,切到行尾。

于 2013-10-15T07:55:12.327 回答