速救!!!!!!!正则,shell 问题,sed

一段文本如下

fasdfasdfasd
<!-- Tocplus 15.1 -->
1111
333
333
333
333
<!-- End of Tocplus -->
fasdfasdfasd

正则格式如下

<\!-- Tocplus 15.1 -->[\d\D]*<\!-- End of Tocplus -->

在线测试没有问题,执行 sed 无法匹配

sed -i 's/<!-- Tocplus 15.1 -->[\d\D]*<!-- End of Tocplus -->/o/g' test
阅读 164
评论 更新于 2019-12-12
    1 个回答
    fefe
    • 6.7k
    1. sed 是按行处理的。用 sed 处理跨行的 pattern 很复杂,比如可以参考这一回答 。不过,可以中使用 -z 参数改变行分隔符为 \0 ,从而把整个文件当成一行。(文件太大的话可能会有问题)
    2. 不同地方使用的正则有非常的不同。比如 sed 就没有 \d\D 。它可以使用 [[:digit:]] 表示数字,但是没有表示非数字。参考这里。你在网上实验的并不一定是 sed 的语法。所以,还不如直接用 .

    所以,对于你这个小文件, sed -z -i 's/<!-- Tocplus 15.1 -->.*<!-- End of Tocplus -->/o/g' test 可以搞定。

    评论 赞赏 2019-12-12
      撰写回答

      登录后参与交流、获取后续更新提醒