Perl 中的命令行跨多行

his*_*amp 3 regex perl

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

#!/bin/bash

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

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

正则表达式中的<>有问题吗?

Mil*_*ler 5

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

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

#!/bin/bash

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

开关

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

  • 是的,使用 `s///` 的标准正则表达式。但是,可以使用单个替代分隔符(如“s!!!”)或平衡分隔符(如“s{}{}”)。 (2认同)