sed的正则匹配如何实现非贪婪?

sed的正则用的是BREs/EREs,不支持非贪婪模式。当然有一些方法可以实现非贪婪,比如:

$ echo abcOabcdOabc | sed 's/.*O//'

结果是abc

$ echo abcOabcdOabc | sed 's/[^O]*O//'

结果是abcdOacb,变相实现了非贪婪的匹配。

但如果是这种情况:

<div>...</div>blabla<div>...</div>

如果想用sed去除前后的<div>...</div>只留下blabla,用s/<div>.*<\/div>//会把blabla也吃掉,又没法用[^div]来实现对div整串的不匹配,那么要怎样实现非贪婪的匹配呢?

阅读 21.6k
3 个回答

我试了下这样可以, echo '<div>...</div>blabla<div>...</div>' | sed 's/<div>[^<]\+<\/div>//g';

如果你是要从html/xml中提取信息的话, 还是用支持DOM操作的东西作处理吧;
正则太费时间, 正确性也不好把握

新手上路,请多包涵

linux下:
使用perl
[in] echo '<div>...</div>blabla<div>...</div>'|perl -lpe 's/<div>.*?</div>//g'
[out] blabla
如果是替换文件内信息:
perl -i -lpe 's/<div>.*?</div>//g' filename.xxx

为啥不用grep?

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