3

この行は FullCalendar (jQuery プラグイン) のMakefileから直接引用したものです。特にドル記号の部分が分かりません。make、シェル、または sed がそれを「処理」するかどうかはわかりません。他の(どうやら?)sedコマンドについても不明です。

DEMO_RE = (<script[^>]*_loader\.js[^>]*><\/script>|<!--\[\[|\]\]-->)[^<]*
DEMO_SED = sed -nE '1h;1!H;$${;g;s/${DEMO_RE}//g;p;}'
  1. 1h は何をしますか?
  2. ドル記号と括弧はどこで、どのように解釈されますか?
  3. 最初の g コマンドと最後の p コマンド (印刷するため) は何をしますか?
4

2 に答える 2

8

それはかなりの胃石です。

DEMO_RE正規表現です。大まかに言えば、それは別の一連の文字の記述であることを意味します。指定された文字列は、この正規表現に一致するか一致しないかのいずれかです。

DEMO_SEDsed コマンドです。この段階では、これは単なる 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タグまたは<!--[[またはで囲まれたもの]]-->、および次のタグまで続くものすべてに一致させたいようです。

于 2012-10-31T05:09:17.130 に答える
3

ベータ版は、sed スクリプトを論理ブロックごとに分解するという素晴らしい仕事をしました。sed スクリプトは、JavaScript の特定のブロックを入力テキストから削除します。彼の最終的な合計は、あなたが必要とするすべてかもしれません. さらに短い答えが必要な場合は、ここに行きます。

あなたが言及した紛らわしいビットはドル記号でした。

        ┌ Double $ is actually just an "escaped" $ character
        │       ┌ Starts a variable reference
        │       │
'1h;1!H;$${;g;s/${DEMO_RE}//g;p;}'
          │     │        │      │
          │     └variable┘      │
          └ Stuff run at EOF ───┘

ドル記号の最初のペアが 1 つのドル記号になり、sed は「ファイルの最後」を意味すると解釈します。したがって、外側の中括弧の間のものは EOF で実行されます。内側の中括弧は、${VARNAME}変数を参照する Make の方法である の形式になっています。シェル変数参照のように見えますが、そうではありません。

この場合、Make 変数の代入は実際には何も実行しないため、変数はその内部DEMO_SEDの内容で代入されます。DEMO_RE皮肉なことに、これが 2 つの変数に分割された理由は、プロセス全体を読みやすくするためです。:-)

これは実際には何も実行しないことに注意してください(つまり、sed)。変数を割り当てるだけです。Makefile の後半では、次のような行を含むターゲットがあると思われます。

${DEMO_SED} path/to/file.html.orig > path/to/file.html

その時点で、これらすべてが機能的なものに変わります。

于 2012-11-01T04:26:50.183 に答える