[英]Remove permissions from long output of ls w/ sed?
我正在嘗試使用正則表達式從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
默認定界符為tab):
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指定從第二列開始。 “-”表示切入行尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.