2

我有一个脚本可以修改目录中的所有文件,并在终端中实时输出修改的状态,如下例所示:

Modifying json.php...   MODIFIED
Modifying layout.php...     ERROR
Modifying a_very_long_named_file.php...     NOT MODIFIED

我想知道是否有一些命令可以用来在有序书的索引中回显,如下所示:

Modifying json.php..........................MODIFIED
Modifying layout.php........................ERROR
Modifying a_very_long_named_file.php........NOT MODIFIED
4

3 回答 3

1

根据您的输入数据,以下行有效:(需要 gawk)

 awk -F '\\.\\.\\. +' -vd=50 '{x=sprintf("%-"d"s   %s",$1,$2);gsub(/  /,"..",x);print x}' file

测试

kent$  cat s
Modifying json.php...   MODIFIED
Modifying layout.php...     ERROR
Modifying a_very_long_named_file.php...     NOT MODIFIED

kent$  awk -F '\\.\\.\\. +' -vd=50 '{x=sprintf ("%-"d"s   %s",$1,$2);gsub(/  /,"..",x);print x}' s
Modifying json.php..................................MODIFIED
Modifying layout.php................................ERROR
Modifying a_very_long_named_file.php................NOT MODIFIED

笔记

  • 您将数字(在我的示例中为 50)更改为您想要的

  • gsub(..) 部分有点冒险。它将两个连接的空间更改为两个点。但我认为最后还有一个空间,这不会是大问题。(在错误/修改之前......)。

编辑

添加 vim 解决方案,如果您觉得在 vim 中播放文本很舒服

  • 类型set ve=all
  • 删除三个点后的那些空格 (...) :%s/\. \+/\./g
  • 光标在第一行,输入qa$vT.x55|pF.v55|r.jq
  • 然后20@a

所有的键输入操作都在代码块中,实际上并没有那么多。这将在 20 行中执行此文本转换,如果您有很多行要做,您可以将 20 更改为 200 或 999。此外,这会将您的“修改”等移动到第 55 列。您也可以更改号码。

如果您在 vim 中执行此操作,它将如下所示:

在此处输入图像描述

于 2013-01-25T17:35:22.280 回答
1

你也可以这样做:

   dots=.................................................
   echo Modifying $file ${dots:${#file}} $msg

这会发送一个点子串作为第三个参数来回显,但不是标准的 sh。(在 bash 中工作。)

于 2013-01-26T16:51:47.260 回答
0

你可以用 echo 来做,我觉得 printf 更令人满意:

printf "Modifying ...................................\033[11G%s\033[35G%s\n" \
    $filename ERROR

将从第 11 列开始打印文件名,并在第 35 列打印 ERROR,中间有 ....。如果文件名太大而无法容纳,它将被部分覆盖。

或者:

如果您在“修改”之后总是有一个空格,您可以尝试:

< input column -t | tr ' ' . | sed 's/\./ /'

这要求所有输出都可用,以便可以在生成任何数据之前确定最大宽度。既然你说“实时”,那可能是不可取的,在这种情况下,你可以使用类似的东西:

echo Modifying json.php MODIFIED | perl -lane 'print "$F[0] $F[1]", "...",
    "." x ( 30 - length( $F[1] )), $F[2]'

打印 33 列宽的“....”(根据需要调整)。如果任何文件名太长,则该行将太宽,但是除非您等待所有数据可用,否则实际上无法确定所需的最大宽度。(除非您在开始之前可以访问所有文件名。选择一个合适的宽度。)额外"..."的是在宽行上至少打印一些点,而不是将文件名与消息连接起来。

于 2013-01-25T17:05:12.900 回答