別のスクリプト内でシェルスクリプト/アプリケーションを呼び出したい。含まれているスクリプトのすべての行は、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.
これは可能ですか?
これを行うには、sed
またはawk
を使用できます。たとえば、メインスクリプトでは、次のことができます。
# execute the command and pipe to sed
second-script | sed 's/\(.*\)/ \1/'
上記のsed
コマンドは、second-script
からの出力の各行に2つのスペースを追加するだけです。
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/null
をfile1
として使用し、STDIN
をfile2
として-
で指定することです。入力として使用する場合、/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
を使用することは、初心者のエラーと見なされることがよくあります。