如何在 sed 替换中转义正则表达式

How to escape regex in sed replace

我想替换文件中的文本。我的正则表达式是 [\s\S\n]*<h1 class='test'>。 我尝试了以下命令,但没有替换文本。

  1. sed -i.bak 's/[\s\S\n]*<h1 class='test'>//g' 36
  2. sed -i.bak 's/\[\s\S\n\]\*<h1 class=\x27test\x27>//g' 36

文件名为36

grep "[\s\S\n]*<h1 class='test'>" -q 36 && echo "FOUND" || echo "NOTFOUND" 的输出是 FOUND

sed 默认情况下仅逐行操作。

要跨行匹配 - 看起来你正在使用 GNU sed - 你需要使用 -z 选项(它将吞噬文件内容并且 sed 将能够“看到”行breaks),然后使用 . 匹配任何字符(在 POSIX 正则表达式中,. 甚至匹配换行符)。注意 [\s\S] 是一个“损坏的”POSIX 模式,因为在 POSIX 括号表达式中,类似 PCRE 的 shorthand 字符 类 被解析为反斜杠和它旁边的一个字符(即 [\s] 匹配 \s)。

另一个问题是您在单引号字符串中使用了单引号,这是错误的(它们最后被剥离并且您的模式中没有 ')。

因此,对于 GNU sed 使用

sed -i.bak -z "s/.*<h1 class='test'>//g" 36

对于非 GNU sed,您可以使用描述的技术 here