vim编辑器如何匹配如图中的正则表达式,需要把文件中匹配内容替换为空,无奈在VIM或shell里的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命令一下子删除。
在 vim 里用 \_. 可以匹配跨行的内容。所以用
:%s/#方法一\_.\{-}#方法二//
就可以完成任务。\{-} 的意思是不贪心匹配。否则 \_.* 将直接匹配到文件末。
另外,如果只是删除的话,如 xiehuahere 所说,用
:/#方法一/,/#方法二/d
要比用正则来的清楚的多。它的意思是删除这两个匹配行之间的内容。
用 sed 工作的方法参考 xiehuahere 说的就挺好。
vim的正则与其他的正则区别有点点大。你在这种网页上测试没什么用。
如果是想把文档中所有图中黄色的5行字替换成空的话,用vim命令:
:%s/#方法一\(.\|\n\)*#方法二//g
你好,你提到说VIM的正则与其他的正则区别很大,那么请问vim与sed的正则是不是应该就差不多,因为我的理解是VI最早主要也是用于SHELL编程的,从重用性角度来说,应该最多是扩展一些功能而已,理论上不会有较大区别,不知我的想法是否正确,也希望可以得到解答,谢谢!
区别很大。主要是正则就没有一个统一的标准,就连解析正则的引擎都分裂成了多种。