我有一个脚本可以修改目录中的所有文件,并在终端中实时输出修改的状态,如下例所示:
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
答案 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中这样做,它将如下所示:
答案 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列宽的“......”(根据需要调整)。如果任何文件名太长,该行太宽,但除非等待所有数据可用,否则无法确定所需的最大宽度。 (除非您在开始之前可以访问所有文件名。选择合适的宽度。)额外的"..."
是在宽行上至少打印一些点,而不是将文件名与消息连接。