速救!!!!!!!正则,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
阅读 2.5k
1 个回答
  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 可以搞定。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进