1

私のBashスクリプトはprintf、次の方法で、フォーマットが適用された他のコマンドの出力を出力するために使用します(先頭の2つのスペースに注意してください):

printf "  %-16s %s\n" "foo:" "$(bar)"

ファイルの最初の行はコメントであるため、先頭の 2 つのスペースがあります。

# foo
  foo:            bar
  foo:            bar
  ...

これは、出力が 1 行のコマンドでは問題なく機能します。ただし、出力が複数行の場合、出力は後続の行の書式設定を失います。

例えば:

printf "  %-16s %s\n" "Contents:" "$(ls -a)"

結果は次のようになります。

  Contents:       .
..
foo
bar

代わりに、私が達成しようとしているのは、各行が(必要に応じて列に)フォーマットされた複数行の出力であり、次のようになります(後続の行に「ヘッダー」がないことに注意してください):

  Contents:       .
                  ..
                  foo
                  bar

これまでの私の理解ではprintf、2 つの引数 (最初の引数は文字列で、もう 1 つは指定されたコマンドの結果) では、2 番目の引数を単一の文字列として扱い、その中に改行文字を含めることができます。したがって、出力は実際には、私が要求printfしたとおりに正しくフォーマットされていますが、探しているものではありません。

のようなコマンドの出力の解析に関連するいくつかの落とし穴があることを認識しており、lsこの問題を解決する現在の可能性を使い果たしています。また、これprintfを行うのに最適な機能ではない可能性があります。

この問題を解決できない場合は、複数行の文字列をカンマ区切りのリストに置き換えることを検討していますが、これは最後の手段です。

必要なフォーマットを実現するための最良の方法は何ですか?

ご協力いただきありがとうございます。

4

2 に答える 2

1
printf "  %-16s %s\n" "foo:" "$(bar | sed '2,$s/^/                   /g')"
于 2013-05-16T09:31:10.427 に答える
0

一連のコマンドに同じ印刷命令を適用するのが難しい場合があります。また、ls からの出力は、環境変数に応じて出力形式が選択されるため、調べるのが面倒な場合があります。

Mac の ls では、以下がうまく機能することがわかりました。

x=$(ls -a); 
x=${x//$'\n'/$'\n'                    }; 
printf "   %-16s %s" "Contents:" "$x" $'\n'
于 2014-11-13T20:38:12.473 に答える