Echo订购了像书的索引

时间:2013-01-25 16:59:19

标签: linux bash echo

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

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

3 个答案:

答案 0 :(得分: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。这也将把你的“MODIFIED”等移到第55列。你也可以改变这个数字。

如果你在vim中这样做,它将如下所示:

enter image description here

答案 1 :(得分:1)

你也可以这样做:

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

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

答案 2 :(得分: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列宽的“......”(根据需要调整)。如果任何文件名太长,该行太宽,但除非等待所有数据可用,否则无法确定所需的最大宽度。 (除非您在开始之前可以访问所有文件名。选择合适的宽度。)额外的"..."是在宽行上至少打印一些点,而不是将文件名与消息连接。