3

自動ビルドを作成し、その中で Perl を使用してファイル内のいくつかのパスを更新しようとしています。

具体的には、htmlファイルで、以下に示すブロックを取りたい

<!-- BEGIN: -->
<script src="js/a.js"></script>
<script src="js/b.js"></script>
<script src="js/c.js"></script>
<!-- END: -->

そしてそれを

<script src="js/all.js"></script>


次のような正規表現をいくつか試しました。

perl -i -pe  's/<--BEGIN:(.|\n|\r)*:END-->/stuff/g' file.html

または次から始めます。

perl -i -pe  's/BEGIN:(.|\n|\r)*/stuff/g' file.html

しかし、私は最初の行を乗り越えることができないようです。何か案は?

4

1 に答える 1

2
perl -i -pe 's/<--BEGIN:(.|\n|\r)*:END-->/stuff/g' file.html

これはとても近いです。

  • /s修飾子と一致するだけです。これにより.、改行を含む任意の文字を一致させることができます。
  • 最も重要なことは、 で試合を開始することです。<!--に注意してください!
  • また、複数のマーカー.*?がある場合は、 のような貪欲でない一致が必要です。END
  • 入力例は、余分なスペースがある可能性があることを示しています。

これにより、次の置換が行われます。

s/<!--\s*BEGIN:.*?END:\s*-->/stuff/sg

@plusplusが指摘したように、各行-pを反復処理します。Perl の「行」の概念を「ファイル全体を一度に」に変更しましょう。

BEGIN { $/ = undef }

または-0、数値引数なしでコマンド ライン スイッチを使用します。

于 2013-06-18T10:53:14.293 に答える