スクリプト自体からヘルプ情報を抽出する

スクリプト自体からヘルプ情報を抽出する

スクリプト自体からヘルプメッセージを抽出したいと思います。

#!/bin/bash
#
# foo - do things
# Author: John Doe <jhon@doe>
# ----------------------------------------------
# SYNOPSIS
#   foo [OPTIONS] FILE
# 
# DESCRIPTION
#   At vero eos et accusamus et iusto odio
#   dignissimos ducimus qui blanditiis praesenti
#   voluptatum deleniti atque corrupti quos.
# ----------------------------------------------

sed -n '/# -\+$/,/# -\+$/ p' $0

効果がある! 2つの区切り記号# -\+$と2つの区切り記号を含む内容のみを印刷します。問題は、区切り文字を印刷したくないということです。

人間に優しい構文を備えたマニュアルページジェネレータに関する提案はありますか?

修正する:たぶん私の質問が正しく表現されていないかもしれません。で始まり、で終わる# -----2行の間の内容を印刷したいと思います----

私はこの解決策を知っています:

sed -n '/# -\+$/,/# -\+$/ p' $0 | head -n -1 | tail -n +2

しかし、私はあまりにも陳腐に見えないクリーンでエレガントなソリューションを望んでいました。

答え1

これを試してみてください:

#!/bin/bash
#
# foo - do things
# Author: John Doe <jhon@doe>
# ----------------------------------------------
# SYNOPSIS
#   foo [OPTIONS] FILE
# 
# DESCRIPTION
#   At vero eos et accusamus et iusto odio
#   dignissimos ducimus qui blanditiis praesenti
#   voluptatum deleniti atque corrupti quos.
# ----------------------------------------------


cat `which $0` | sed -n '0,/# -\+$/d;/# -\+$/,$d;p'

答え2

次の方法でこれを行うこともできますawk

awk '/^# --/{ flag=!flag; next}; flag' file

目的のテキストを分離するために使用するテキストの先頭と終了が同じであると仮定すると、うまく# --機能します。範囲モード失敗するため、フラグを使用する必要があります。これ次の声明範囲を印刷する前に awk が次のレコードに移動するよう強制します。

答え3

これは非常に簡単に行うことができますawk

awk -v RS='\n# -+' 'NR==2' $0

RSレコード区切り記号を適切に設定し、NR==22番目のレコードを印刷します。

gsubたとえば、次のようにコメント記号と余分なスペースを削除できます。

awk -v RS='\n# -+' 'NR==2 { gsub("\n# ", "\n"); print }' $0

修正する

最初の行が空にならないようにするに追加します\nRSしかし、今、最初の行は変わらないので、gsub次のようにgensub呼び出されます。

awk -v RS='\n# -+\n' 'NR==2 { print gensub("(^|\n)# ", "\\1", "g") }' $0

答え4

必要なのは「ここに文書化」と言います。幸いなことに、すでにbashに実装されています。次のURLを確認してくださいhttp://tldp.org/LDP/abs/html/here-docs.htm

以下を使用できます。

cat <<end-of-message
----------------------------
message lines...
----------------------------
end-of-message

引数が入力された場合、または-hオプションなどのもの、または引数がない場合にのみ印刷する条件をスクリプトの上部に追加できます。

関連情報