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

次のこともできます。

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

これは、ドットの部分文字列を 3 番目の引数として echo に送信しますが、標準の sh ではありません。(bash で動作します。)

于 2013-01-26T16:51:47.260 に答える
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(..) 部分は少し危険です。2 つの接続されたスペースを 2 つのドットに変更します。しかし、最後にスペースが残っていても大きな問題にはならないと思います。(エラー/変更前...)。

編集

vimでテキストを再生するのが快適だと思う場合は、vimソリューションを追加してください

  • タイプset ve=all
  • 3 つのドットの後のスペースを削除します (...) :%s/\. \+/\./g
  • 最初の行にカーソル、タイプqa$vT.x55|pF.v55|r.jq
  • それから20@a

すべてのキー入力操作はコード ブロックで行われますが、実際にはそれほど多くはありません。これにより、このテキスト変換が 20 行で実行されます。実行する行が多い場合は、20 を 200 または 999 に変更できます。また、これにより、「MODIFIED」などが55列目に移動します。番号も変更できます。

vim で実行すると、次のようになります。

ここに画像の説明を入力

于 2013-01-25T17:35:22.280 に答える
0

あなたはおそらくechoでそれを行うことができます.printfの方が満足できると思います.

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

列 11 から始まるファイル名を出力し、列 35 に ERROR を出力します。その間に .... を挿入します。ファイル名が大きすぎて収まらない場合は、部分的に上書きされます。

または:

「変更」の後に常にスペースが 1 つある場合は、次のことを試してください。

< 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 に答える