命令行在Perl中跨越多行

时间:2014-08-01 20:08:41

标签: regex perl

这是我在Bash脚本中的单行Perl命令。如何在多行中更改s?

#!/bin/bash

file=$1
echo "processing $file"
perl -0777pe 's/.*<script[ |>].*<\/script>/<script> \.\.\. <\/script>/g' "$file" >"${file}changed.txt"

我在此脚本中输入XHTML文件。当开始脚本和结束脚本标记位于同一行时,Perl命令行可以正常工作。 Perl在单独的行上找不到开始脚本和结束脚本标记。

&lt;&gt;是否存在问题在正则表达式?

2 个答案:

答案 0 :(得分:3)

您正在使用-0777来覆盖整个文件。现在,您需要做的就是将/s开关添加到正则表达式中,以便任何字符.都匹配新行。

您可能还需要将正则表达式更改为非贪婪.*?,并且可以通过使用断言和不同的分隔符来简化正则表达式:

#!/bin/bash

file=$1
echo "processing $file"
perl -0777 -pe 's{<script\s*>\K.*?(?=</script>)}{ ... }gs' $file > "${file}changed.txt"

切换

  • -0777:覆盖整个文件
  • -p:为输入文件中的每个“行”创建一个while(<>){...; print}循环。
  • -e:告诉perl在命令行上执行代码。

答案 1 :(得分:2)

试试这个:

perl -0777pe 's:<script[ |>].*?</script>:<script> ... </script>:gs' "$file"

来自prelre

  

<强>取值

     

将字符串视为单行。即改变&#34;。&#34;匹配任何   任何角色,甚至是换行符,通常不会   匹配。

非贪婪匹配.*?可帮助处理多个<script> </script>块。没有它,(所以贪婪匹配.*)为

<script> some </script> <script> some2 </script>

只会提供一个

<script>...</script>

使用非贪婪匹配(.*?),相同输入将给出

<script>...</script> <script>...</script>