这是我在 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 在单独的行上找不到开始脚本和结束脚本标记。
正则表达式中的<>有问题吗?
您正在使用-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在命令行上执行代码。