如何在某个字符之后从ls命令的输出中删除空格?

时间:2015-03-21 21:17:59

标签: bash unix sed

这是我的ls命令和后处理:

ls -l $pwd | tail -n +2 | cut -c1-10,50-999999  |  sed 's/./& /g'  |
    sed  's/\(.\{7\}\)/&  /g' | sed 's/\(.\{30\}\)/&/g'

这是输出:

- r w x   r - -   r - -     a d d   . o l d   

我想删除文件名中的所有空格,所以我最终会得到这样的结果:(请记住,空格模式保留在权限中)

- r w x   r - -   r - -     add.old   

2 个答案:

答案 0 :(得分:3)

你根本就没有。这里有一整篇文章,详细说明了为什么你不应该解析ls输出,而是使用像shell这样的工具组合(很可能非常全面)文件名为globbing,find和stat。 / p>

例如:

for name in * ;do echo $(stat -c '%A' "$name"):$name ; done

编辑: stat为您提供了许多格式来帮助您实现所需的输出,现在这可以为您提供明确的输出(但是,这可能会出现问题,例如文件名中的换行符),您可以单独使用sed输出上的stat。请参阅man stat

答案 1 :(得分:0)

如果文件名不合理,编写防弹代码来解析ls输出是很棘手的。需要注意的是,您的文件名不能包含换行符,并且应该避免使用其他控制字符(但或多或少其他任何东西都应该没问题),您可以冒险解析ls的输出。如果您的文件名仅限于便携式文件名字符集([-a-zA-Z0-9_.]),那么您应该没问题。但请注意,并非所有人都会像使用文件名那样严格,因此如果有人创建了包含意外字符的名称,您的脚本可能会突然失败。请注意,文件名中的前导破折号可能会造成严重破坏;例如--version之类的名称会使平均GNU实用程序出现意外行为。

  • 你被警告了!

您可以使用cut -c1-10,50-来避免输入所有这些内容。您可以在每个表达式前面使用sed将3 -e个命令合并为一个命令。

通过一点点sed技巧,您可以更轻松地处理间距。在我的Mac上,文件名开头的正确列是第54列,而不是50:

$ ls -l |
> sed -e '1d;12q' |     # Only 11 file names listed
> cut -c 1-10,54- |
> sed -e 's/\(.\)\(...\)\(...\)\(...\)/\1\2 \3 \4 @@/' \
>     -e h -e 's/@@.*/@@/' -e 's/[^@]/& /g' -e G -e 's/\n//' \
>     -e 's/@@[^@]*@@//'
- r w -   r - -   r - -   2da.c
- r w -   r - -   r - -   3dalloc1.c
- r w -   r - -   r - -   3dalloc2.c
- r w -   r - -   r - -   3dalloc3.c
- r w -   r - -   r - -   3dalloc4.c
- r w -   r - -   r - -   4 @@ Testing
- r w -   r - -   r - -   @@ Testing
d r w x   r - x   r - x   Floppy
d r w x   r - x   r - x   IQ
d r w x   r - x   r - x   Primes
d r w x   r - x   r - x   SHA-256
$

sed命令有什么作用?

  • 在每组3个权限位之后用空格替换权限字段,并在权限末尾添加@@
  • 将修改后的行复制到保留空间。
  • 仅使用@@替换@@及其后的所有内容。
  • 在每个非@字符后面加上一个空格。
  • 使用换行符将保留空间附加到图案空间。
  • 删除换行符。
  • 删除两个@@标记,并且它之间的所有内容都不是@

这会使文件名中的@@标记保持不变 - 见证其中包含@@空格的两个名称。

对于记录,传递给cut然后sed的11行是:

-rw-r--r--   1 jleffler  staff     2362 Mar  6 19:48 2da.c
-rw-r--r--   1 jleffler  staff     1638 Mar  6 19:48 3dalloc1.c
-rw-r--r--   1 jleffler  staff     2870 Mar  6 19:48 3dalloc2.c
-rw-r--r--   1 jleffler  staff     2968 Mar  6 19:48 3dalloc3.c
-rw-r--r--   1 jleffler  staff     2096 Mar  6 19:48 3dalloc4.c
-rw-r--r--   1 jleffler  staff        0 Mar 21 16:46 4 @@ Testing
-rw-r--r--   1 jleffler  staff        0 Mar 21 16:47 @@ Testing
drwxr-xr-x   4 jleffler  staff      136 Mar  9 23:03 Floppy
drwxr-xr-x   8 jleffler  staff      272 Mar  6 19:48 IQ
drwxr-xr-x  33 jleffler  staff     1122 Mar  6 19:48 Primes
drwxr-xr-x  13 jleffler  staff      442 Mar  6 19:48 SHA-256