【问题标题】:How to escape regex in sed replace如何在 sed 替换中转义正则表达式
【发布时间】:2021-12-19 05:29:13
【问题描述】:

我想替换文件中的文本。我的正则表达式是[\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

【问题讨论】:

标签: regex sed


【解决方案1】:

sed 默认只逐行操作。

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

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

所以,用 GNU sed 使用

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

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

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2021-12-31
    • 2012-01-26
    • 1970-01-01
    • 2021-01-01
    • 2012-12-03
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多