【发布时间】:2013-10-14 22:54:22
【问题描述】:
我正在尝试使用正则表达式从 ls -l 中删除权限。这就是我正在尝试的:
ls -l | sed '/^.([rwx]{9}) //'
它不工作,我不知道为什么?
【问题讨论】:
-
也不起作用 [rwx-]
我正在尝试使用正则表达式从 ls -l 中删除权限。这就是我正在尝试的:
ls -l | sed '/^.([rwx]{9}) //'
它不工作,我不知道为什么?
【问题讨论】:
Posix sed 仅允许“基本”正则表达式,不包括 {n,m} 重复语法(除其他外)。 sed 的 GNU 版本与大多数 linux 发行版一起分发,如果您将其与 -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 允许每个组中三个字符中的最后一个字符是其他字符,并且还允许在模式组的末尾附加一个“备用访问方法标志”。
【讨论】:
.。但是,它会在 setuid/setgid 可执行文件上失败。我应该提到这一点。 OP 是“为什么这个正则表达式不起作用?”所以我尝试使用大致相同的正则表达式来回答这个问题。
对于这些情况,我喜欢使用带有字段分隔符的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(" ")'
Each 打印从第二个字段开始的每一行。
【讨论】:
尝试使用“剪切”命令。
ls -l |cut -d ' ' -f2-
-d 指定使用的字段分隔符。这里是一个“空间”。 -f 后的 2 指定从第二列开始。 '-' 表示,切到行尾。
【讨论】: