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

2020-07-22 科技 88阅读

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命令一下子删除。

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com