web-dev-qa-db-ja.com

シェルスクリプトの出力インデント

別のスクリプト内でシェルスクリプト/アプリケーションを呼び出したい。含まれているスクリプトのすべての行は、2つのスペースでインデントする必要があります。これは可能ですか?

出力は次のようになります。

I'm the main-scripts' output.
  I'm a second script, called inside the main-script.
  Every line of my output is indented by 2 spaces.
  This is not implemented inside of me, but in the main-script
  as I should also be called outside of the main-script and then
  my output shouldn't be indented.
Thats all from the second script.

これは可能ですか?

2
lschuermann

これを行うには、sedまたはawkを使用できます。たとえば、メインスクリプトでは、次のことができます。

# execute the command and pipe to sed
second-script | sed 's/\(.*\)/  \1/'

上記のsedコマンドは、second-scriptからの出力の各行に2つのスペースを追加するだけです。

3
gogators

Unixではいつものように、オプションがあります。

paste

空のLHSファイルでpasteユーティリティを使用します。次に例を示します。

cat ~/.bashrc | paste /dev/null -

catコマンドは、2番目のスクリプトのプレースホルダーです。

pasteコマンドは、2つのファイルを取得し、それらをまとめるように設計されています。例:

$ paste file1 file2
file 1 line 1    <TAB>  file 2 line 1
file 1 line two  <TAB>  file 2 line 2
file 1 line 3    <TAB>  file 2 line iii

上記で使用している方法は、/dev/nullfile1として使用し、STDINfile2として-で指定することです。入力として使用する場合、/dev/nullはNULL文字を返します。これは、2番目のスクリプトの出力であるfile2のすべての行の前に、NULLとそれに続くTAB文字があることを意味します。

さらに先に進むことができます:pasteには--delimiterオプションがありますが、2つのスペースを指定しても期待される効果は得られません:区切り文字1は、最初の列と2番目の列の間に使用されます。 区切り文字2 2番目と3番目の間で使用されます。

paste|expand

2スペースのインデントを取得するには、expand -2を介して再度パイプされたプレーンなpasteを使用します。これにより、すべてのタブが2つのスペースに変わります。

cat ~/.bashrc | paste /dev/null - | expand -2

これは、指定したとおりに動作します。

sedまたはawk

さらに別のアプローチは、sedまたはawkを使用することです。

cat ~/.bashrc | sed 's/^/  /'

これは、行の先頭( "^")を検索し、スペースのペアを置換するか、実際に挿入します。

cat ~/.bashrc | awk '{printf "  %s\n",$0}'

これは、各全行( "$0")を取り、2つのスペースのフォーマット指定子、印刷する文字列、改行の順に使用して、printfでフォーマットします。


上記のすべてのコマンドは、パイプラインのcat部分、つまりpaste /dev/null ~/.bashrcまたはpaste /dev/null ~/.bashrc|expand -2、同様にsed 's/^/ /' ~/.bashrcまたはawk '{printf " %s\n",$0}' ~/.bashrcを削除できることに注意してください。パイプラインで最初にcatを使用することは、初心者のエラーと見なされることがよくあります。

2
Rich