【问题标题】:Remove permissions from long output of ls w/ sed?从 ls w/sed 的长输出中删除权限?
【发布时间】:2013-10-14 22:54:22
【问题描述】:

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

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

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

【问题讨论】:

  • 也不起作用 [rwx-]

标签: regex linux bash shell


【解决方案1】:

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 允许每个组中三个字符中的最后一个字符是其他字符,并且还允许在模式组的末尾附加一个“备用访问方法标志”。

【讨论】:

  • sed 表达式会对非常规文件产生影响,如目录、符号链接、套接字、设备节点等。cut 方法很好,但我个人更喜欢字段分隔符。
  • @grim:我想你错过了正则表达式开头的.。但是,它会在 setuid/setgid 可执行文件上失败。我应该提到这一点。 OP 是“为什么这个正则表达式不起作用?”所以我尝试使用大致相同的正则表达式来回答这个问题。
【解决方案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(" ")'

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

【讨论】:

    【解决方案3】:

    尝试使用“剪切”命令。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2017-12-19
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多