vim编辑器如何匹配如图中的正则表达式,需要把文件中匹配内容替换为空,无奈在VIM或shell里的sed测试无效

请教应该如何使用sed命令匹配并替换为空

sed内部有模式空间和保留空间之分。

通常情况下,sed从文件中逐行读入内容到模式空间内进行处理,一次只处理一行,所有你没法直接匹配多行内容。

 

涉及用sed处理多行文本的问题,首先考虑直接匹配地址范围来处理,不行的话其次还可以考虑利用sed的保留空间。

  

1)此问题直接用sed匹配地址范围即可。

str="#方法一\n你好\n我好\n他好\n#方法二\nNihao\nWohao"
echo -e "$str" | sed '/^#方法一/,/^#方法二/d'

这样就可以了,"#方法一"到"#方法二"以及之间的所有行就都被删除了。

  

2)更复杂点的情况,通常我们还可以利用sed的保留空间来完成。

在处理这个问题上繁杂了点,但非常适合新手学习理解用。 

echo -e "$str" | sed -n '/^#方法一/{:a;h;/^#方法二/{x;d};/^#方法二/!{n;ba}};p'

通过h命令可以将模式空间里的内容附加到保留空间,利用循环反复操作(:a 设置标签a;ba 跳转到标签a;n命令读入下一行到模式空间),在保留空间内拼接成多行文本(通过\n分隔),然后通过x命令交换保留空间与模式空间的内容(或者通过g命令拷贝保留空间内容覆盖到模式空间),这样才在模式空间内得到多行文本,最后用d命令一下子删除。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-28

在 vim 里用 \_. 可以匹配跨行的内容。所以用

:%s/#方法一\_.\{-}#方法二//

就可以完成任务。\{-} 的意思是不贪心匹配。否则 \_.* 将直接匹配到文件末。


另外,如果只是删除的话,如 xiehuahere 所说,用

:/#方法一/,/#方法二/d

要比用正则来的清楚的多。它的意思是删除这两个匹配行之间的内容。


用 sed 工作的方法参考 xiehuahere 说的就挺好。

第2个回答  2013-08-27

vim的正则与其他的正则区别有点点大。你在这种网页上测试没什么用。

如果是想把文档中所有图中黄色的5行字替换成空的话,用vim命令:

:%s/#方法一\(.\|\n\)*#方法二//g

追问

你好,你提到说VIM的正则与其他的正则区别很大,那么请问vim与sed的正则是不是应该就差不多,因为我的理解是VI最早主要也是用于SHELL编程的,从重用性角度来说,应该最多是扩展一些功能而已,理论上不会有较大区别,不知我的想法是否正确,也希望可以得到解答,谢谢!

追答

区别很大。主要是正则就没有一个统一的标准,就连解析正则的引擎都分裂成了多种。

相似回答