Perl替换不按预期工作

时间:2015-02-15 16:50:23

标签: regex perl

我想使用perl命令将多个js文件块替换为缩小版本。

当我在在线网站上测试时,它有效 但是当我在命令行中运行时,却没有。

echo '<!doctype html>
    <html>
    <head>
      <script src="lib/angular.js"></script>
      <!-- build:js ../ute.min.js -->
      <script src="app/app.js"></script>
      <script src="app/services/uteEndpoint.js"></script>
      <!-- endbuild:js -->' |  perl -pe 's/<!-- build:js ([^ ]+) -->[^\!]+<!-- endbuild:js -->/<script src="$1"><\/script>/gm'

我在命令行中做错了什么?

我在这里测试了http://www.regexe.com/,我的预期输出是

<!doctype html>
<html>
<head>
  <script src="lib/angular.js"></script>
  <script src="../ute.min.js"></script>

1 个答案:

答案 0 :(得分:4)

默认情况下,Perl逐行处理输入。由于您正在使用多行,因此需要启用段落模式。

perl -00pe 's~<!-- build:js ([^ ]+) -->[^\!]+<!-- endbuild:js -->~<script src="$1"></script>~gm'

OR

perl -0777pe 's~<!-- build:js ([^ ]+) -->[^\!]+<!-- endbuild:js -->~<script src="$1"></script>~gm'

示例:

$ echo '<!doctype html>
>     <html>
>     <head>
>       <script src="lib/angular.js"></script>
>       <!-- build:js ../ute.min.js -->
>       <script src="app/app.js"></script>
>       <script src="app/services/uteEndpoint.js"></script>
>       <!-- endbuild:js -->' |  perl -0777pe 's/<!-- build:js ([^ ]+) -->[^\!]+<!-- endbuild:js -->/<script src="$1"><\/script>/gm'
<!doctype html>
    <html>
    <head>
      <script src="lib/angular.js"></script>
      <script src="../ute.min.js"></script>