正如另一个人所建议的那样,'/'您的正则表达式中的各种字符需要用 a 转义,'\'因为 Perl 会将它们读作s///;过早结束,否则会导致一些错误。在处理这些时,您总是必须注意特殊字符,正如我看到您在各个时期所做的那样。
's/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1\.0 Transitional//EN" "http://www\.w3\.org/TR/xhtml1/DTD/xhtml1-transitional\.dtd">//g' 
您可以将 a 中的分隔符更改s///;为其他内容,例如 
s###或s{}{}以帮助缓解问题,如果您使用 HTML,我通常建议您这样做。  
即便如此,我会说尽量简化正则表达式以适应应用程序。因为像这样的 HTML 使用起来可能很讨厌,所以尝试使用非贪婪匹配任何类型的正则表达式,但使用<and>来捕获特定标签。例如,您可能会使用这样的正则表达式...
s{<!DOCTYPE .*?>}{}s
和一些解释的格式......
s{
    <!DOCTYPE   # opening doctype tag
    \s          # one whitepsace
    .*?         # anything (even newlines because of /s flag) non-greedily
     >          # until the first closing greater than 
}{}xs;          # x is ignore whitespace, s is have '.' match anything (even \n)
此示例使用/x标志将其注释掉并解释所有内容,但如果您在命令行上执行此操作,则没有必要这样做。  
我不能谈论你问题的其余部分,因为我对 shell 命令不太熟悉,只对正则表达式部分。