TL;DR- 以下のパターンには多くのことが起こっており、sed
個々の部分をコマンド全体にまとめる方法がわかりません。
ヒットバージョン:GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)
RBENVコードベースファイルをファイルごとに読み込んでシェルスクリプトを学んでいますが、次のようなrbenv-help
ファイルが見つかりました。この関数の定義:
extract_initial_comment_block() {
sed -ne "
/^#/ !{
q
}
s/^#$/# /
/^# / {
s/^# //
p
}
"
}
この関数がどのように呼び出されるかを理解します。コードの下したがって、最初の引数がファイル名であることがわかります。
extract_initial_comment_block < "$filename" | collect_documentation
ここでは、「$ filename」とマークされたファイルがコマンドの標準入力として使用されていることがわかりますsed
。私の質問に関する限り、チェーン機能 "collect_documentation"は関係ありません。
私はまた、関数の名前を通して、その目的が次のようなファイルを取得することを知っています。これ、要約、および使用法の説明(リンクされたファイルの2行から14行)を返します。しかし、私はこの理論をテストしていないので、100%正確ではないかもしれません。
さらに、私も知っていますこのStackExchangeの答えからこのフラグの目的は、後続の文字列をコマンド(または改行文字で区切られたコマンドのコレクション)として解釈するように指示する-e
ことです。sed
したがって、本文には順番に解釈するextract_initial_comment_block
ための3つの別々のスクリプトが含まれているようです。sed
同じStackExchangeの答えは、{...}
コマンドを一緒にグループ化することを説明しますが、これがこの正規表現(この正規表現?)で何が起こっているのかわかりません。
私が知る限り、sed
ここには3つのスクリプトがあります。
/^#/ !{
q
}
s/^#$/# /
/^# / {
s/^# //
p
}
ただし、各スクリプト内でも、次^#
のようなものを活用しても識別できないいくつかのパターン(たとえば、および)が使用されます。!{ q }
Linuxデータプロジェクト。可動部分が多いようで、各スクリプトがどのように最終製品に組み合わされるのか分かりません。
私は思考プロセスをできるだけ明確に説明しようとします。これまで私の考えは正しいですか?そうでなければ、私はどこに行きましたか?それでは、渡された各コマンドの意味をどのように推論しますかsed
?
ベストアンサー1
/^#/ !{ q }
スラッシュ間の部分は^
文字列の先頭、#
つまり文字自体を表す正規表現です。このモードは、関連するコマンドが実行される行を選択します。末尾は!
一致の意味を反転させてq
終了するコマンドです。したがって、sedプログラムが1行を見ると終了します。いいえcommentタグで始めてください#
。
s/^#$/# /
s/a/b/
S^
行の始まり、$
終わり、行自体を意味するaの代わりにbを使用してください#
。したがって、1行だけ入力すると+space#
に変わります。#
/^# / { s/^# // p }
#
行が/^# /
aと空白()で始まる場合は、空白#
を空白(s/^# //
)に置き換えて行(p
)を印刷します。以前の交換が便利な場所です。
sedのオプション-n
(コマンドの先頭) sedに教えてください。いいえデフォルトで行われているのと同様に、スクリプトを実行した後にその行を印刷します。
スクリプトは#
、で始まる行を無視します。いいえその後にスペースがあり、そのスペースで始まるハッシュバン行を含めると、スクリプトがどの#!
インタプリタを使用しているかをオペレーティングシステムに通知します。意図したものかもしれませんが、他の隠されたセリフがあるかもしれません。
例えば
#!/bin/sh
# some script
#
#this is ignored
# this prints
# this doesn't print any more
whatever
~になる
some script
this prints