我正在尝试使用正则表达式从 ls -l 中删除权限。这就是我正在尝试的:
ls -l | sed '/^.([rwx]{9}) //'
它不工作,我不知道为什么?
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 允许每个组中三个字符中的最后一个字符是其他字符,并且还允许在模式组的末尾附加一个“备用访问方法标志”。
对于这些情况,我喜欢使用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(" ")'
每个打印从第二个字段开始的每一行。
尝试使用“剪切”命令。
ls -l |cut -d ' ' -f2-
-d 指定使用的字段分隔符。这里是一个“空间”。-f 后的 2 指定从第二列开始。'-' 表示,切到行尾。