それはかなりの胃石です。
DEMO_RE
正規表現です。大まかに言えば、それは別の一連の文字の記述であることを意味します。指定された文字列は、この正規表現に一致するか一致しないかのいずれかです。
DEMO_SED
sed コマンドです。この段階では、これは単なる Make 変数、つまり一連の文字ですが、後で (Make による変数展開の後) シェルに渡すことができ、シェルはそれを sed コマンドとして解釈します。
この sed コマンドを完全には理解していませんが、これが私の最善の試みです。途中から:
sed 's/${DEMO_RE}//'
Make は${DEMO_RE}
最初の行で gobbledegook の文字列に展開し、考慮されているテキスト行との一致を探し、一致するテキストを何も変更しません (つまり、削除します)。
sed 's/${DEMO_RE}//g'
コマンドのg
修飾子はs
、最初に見つかったものだけでなく、すべての一致に対して置換 (この場合は削除) を行うことを意味します。
sed -nE 's/${DEMO_RE}//g;p'
デフォルトでは、-n
手段は結果を出力しません。手段はパターン空間のp
内容を出力するので、当分の間、これらの変更は互いに相殺されます。このE
手段は、正規表現を基本正規表現ではなく、拡張正規表現として解釈します。
sed -nE '{s/${DEMO_RE}//g;p}'
中括弧はこれらのコマンドをグループ化します。
sed -nE '${;g;s/${DEMO_RE}//g;p;}'
今、物事は複雑になります。Sed には、ホールド スペースと呼ばれる 2 番目のバッファーがあります。このg
コマンドは、ホールド スペースの内容をパターン スペース (人々が通常使用するバッファであり、ほとんどの人が知っている唯一のバッファ) にコピーします。これは、物を保留スペースに入れる他のコマンドを検討するまではあまり意味がありません。これ$
は、sed が入力の最後の行に到達した場合にのみ、このコマンド (中括弧の内容) を適用する必要があることを意味します。先頭のセミコロンには何の意味もありませんが、まったく何もしないとは言えません。ここでは、読みやすさのために置換コマンドを省略します。
sed -nE '$${;g;p;}'
Make は で始まるものを展開しようとし$
、'$' をそのまま sed に渡したいので、別の '$' でエスケープします。Make は展開$$
され、シェル$
に渡さ${...
れます (シェルはそれを sed に渡します)。
sed -nE '1h;1!H;$${;g;p;}'
この1h
手段は、入力の最初の行を保留スペースにコピーします。この手段は、最初の行以外のすべての行をホールド スペースに1!H
追加します。を覚えておいてください。sed が中括弧内のコマンドのグループを実行するまで何も出力されません。これは、入力の最後の行が読み込まれたときにのみ発生します。-n
sed -nE '1h;1!H;$${;g;s/${DEMO_RE}//g;p;}'
「すべての入力をホールド スペースに読み込み、何も出力せず、最後にすべて引き戻し、(拡張されている可能性がある) に一致するものをすべて切り取り、残ったものをすべて出力します。」
この答えはかなり長くなりました。正規表現の大まかな翻訳を提供できますが、この媒体を混乱させない方法でそれを行うのは面倒です。script
タグまたは<!--[[
またはで囲まれたもの]]-->
、および次のタグまで続くものすべてに一致させたいようです。