这是我在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;是否存在问题在正则表达式?
答案 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>