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

请教应该如何使用sed命令匹配并替换为空... 请教应该如何使用sed命令匹配并替换为空 展开
 我来答
百度网友5311d79
2013-08-27 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3207万
展开全部

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

hqxz556
2013-08-28 · TA获得超过2831个赞
知道大有可为答主
回答量:1686
采纳率:93%
帮助的人:572万
展开全部

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

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

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


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

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

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


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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
栩箭
2013-08-27 · TA获得超过5310个赞
知道大有可为答主
回答量:3036
采纳率:0%
帮助的人:1651万
展开全部

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

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

:%s/#方法一\(.\|\n\)*#方法二//g
追问
你好,你提到说VIM的正则与其他的正则区别很大,那么请问vim与sed的正则是不是应该就差不多,因为我的理解是VI最早主要也是用于SHELL编程的,从重用性角度来说,应该最多是扩展一些功能而已,理论上不会有较大区别,不知我的想法是否正确,也希望可以得到解答,谢谢!
追答
区别很大。主要是正则就没有一个统一的标准,就连解析正则的引擎都分裂成了多种。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式