【shell】vim 替换

1. 替换

1.1 光标所在行的替换

其中,,s表示插入,g表示当前行查找

:s/abc/xyz/g

1.2 全文替换

其中,1表示第1行,$表示最后1行

:1,$s/abc/xyz/g

其中,%表示全文

:%s/abc/xyz/g

 1.3 转义替换

其中, S.替换为S->

此处因为点号“.”为特殊匹配符,在正则中表示单个字符,所以如果想匹配点号,就需要把“\”放在点号前面,表示取消点号的特殊意义。

:s/S\./S->/g

1.4 连间隔符都可以改变

如果你要匹配和替换“http://roclinux.cn/index.php”这样一个 URL,你会发现这很麻烦

:%s/http:\/\/roclinux\.cn\/index\.php/https:\/\/www\.baidu\.com/index\.php/g

里面好多的正斜线“\”和反斜线“/”啊,真是一个反人类的替换表达式

Vim 允许我们自定义间隔符,比如我们可以用 # 来替换/,如 s/abc/xyz/ 可以替换为 s#abc#xyz#,或者 s!abc!xyz!都是可以的

改良:

:%s#http://roclinux\.cn/index\.php#https://www\.baidu\.com/index\.php#g

1.5 复杂替换

如果我希望在含有日期格式(XXXX-XX-XX)的字符串两侧加上一对单引号,即 2008-07-01 变成‘2008-07-01’,应该如何写这个替换表达式呢?

原文件为

aaa 2008-07-01 bbb
ccc 2008-07-12 aaa

我们需要用下面的替换命令来实现加引号的效果:

:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/'\1'/g

替换后为:

aaa '2008-07-01' bbb
ccc '2008-07-12' aaa

这个替换命令比较复杂,我们要逐步解释一下,这里面共涉及了三个知识点:

第一个知识点:[0-9] 表示 0 到 9 之间的任一个数字,这是正则中表示数字集合的标准写法。

第二个知识点:{n} 表示将此符号前面的元素重复 n 遍,所以 [0-9]{4} 就表示一个四位数的数字。

第三个知识点:如果在匹配方案中用到了(),则表示要暂存括号中所匹配到的内容,而 \1 表示替换为暂存的内容(题外话:如果存在多个括号组,则后面要通过编号来依次对应,如 \1、\2、\3 等)。在本例中,我们匹配的是 2008-07-01,那么加了括号后就会被暂存起来,而在后面的 \1 处就会被替换过来,外面再加一对引号,就完成了!

转自:

http://c.biancheng.net/linux/Vim.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值