求教:如何用vim递增替换。

Vim、Emacs配置和使用
回复
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

求教:如何用vim递增替换。

#1

帖子 ytaome » 2011-04-15 17:50

比如说有

代码: 全选

1.fdfdfadsf
2.dfdfdf
3.dfdfd  4.dfdf 5.dfd dg
6.dfd 
这个文本文件,我想将1. 2. ...改成a2. a3. a4. ...这类序号。在vim中怎么处理呢?
最好是用g命令一行解决,脚本也行。多谢。 :em06
sarrow
帖子: 403
注册时间: 2007-10-27 1:04
送出感谢: 0
接收感谢: 1 次

Re: 求教:如何用vim递增替换。

#2

帖子 sarrow » 2011-04-15 18:42

%s/\ze\<\d\+\./a/ge
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

Re: 求教:如何用vim递增替换。

#3

帖子 ytaome » 2011-04-17 8:52

多谢sarrow。让我知道了\ze和\<
不过我不但想要:①数字前面加上一个前缀,
而且还想要②数字是要有一个代数运算处理(例如本例中的+1).
③递增处理1、2、3...,如果2、3、之间遇到4、就不管它。
可以在一行中解决吗?
//事件起因是在网上给老婆下了一些学习资料。想搞个排序。
头像
lilydjwg
论坛版主
帖子: 4165
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 求教:如何用vim递增替换。

#4

帖子 lilydjwg » 2011-04-17 13:07

ytaome 写了:多谢sarrow。让我知道了\ze和\<
不过我不但想要:①数字前面加上一个前缀,
而且还想要②数字是要有一个代数运算处理(例如本例中的+1).
③递增处理1、2、3...,如果2、3、之间遇到4、就不管它。
可以在一行中解决吗?
//事件起因是在网上给老婆下了一些学习资料。想搞个排序。

代码: 全选

for
sarrow
帖子: 403
注册时间: 2007-10-27 1:04
送出感谢: 0
接收感谢: 1 次

Re: 求教:如何用vim递增替换。

#5

帖子 sarrow » 2011-04-17 13:27

不懂你说什么。特别是这一句:

> ③递增处理1、2、3...,如果2、3、之间遇到4、就不管它。

最好给一个转换前后对比的范例。

如果仅仅是递增1的话:

%s/\<\d\+\ze\./\='a'.str2nr(submatch(0) + 1)/ge
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

Re: 求教:如何用vim递增替换。

#6

帖子 ytaome » 2011-04-17 22:07

原文

代码: 全选

1.fdfdfadsf
2.dfdfdf
3.dfdfd 5.dfd dg 4.dfdf 
6.dfd
想替换成:

代码: 全选

a2.fdfdfadsf
a3.dfdfdf
a4.dfdfd 5.dfd dg a5.dfdf 
6.dfd
解决方法:
如果用

代码: 全选

for i in range(1,1000)
    %s/..../.../gc
endfor
我还想问:

代码: 全选

let i=1 | g/??? | i+=1
可以实现这样的功能吗?
//表达含糊的地方还请见谅,一直以来说话就有问题没得救了。
头像
lilydjwg
论坛版主
帖子: 4165
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 求教:如何用vim递增替换。

#7

帖子 lilydjwg » 2011-04-17 23:14

那些一行有多个数字的是什么?如果可以弄成每行一项的话排序倒是很简单。
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

Re: 求教:如何用vim递增替换。

#8

帖子 ytaome » 2011-04-18 9:14

lilydjwg 写了:那些一行有多个数字的是什么?如果可以弄成每行一项的话排序倒是很简单。
就是一些无序列的数字而已。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 求教:如何用vim递增替换。

#9

帖子 eexpress » 2011-04-18 9:48

递增替换
我是被这名词忽悠进来的。
● 鸣学
nickdgd
帖子: 156
注册时间: 2008-06-21 17:20
送出感谢: 0
接收感谢: 0
联系:

Re: 求教:如何用vim递增替换。

#10

帖子 nickdgd » 2011-04-18 16:00

eexpress 写了:
递增替换
我是被这名词忽悠进来的。
me 2
我的游记和相册:http://www.wensh.net
头像
sunfish
帖子: 961
注册时间: 2008-05-03 1:53
送出感谢: 18 次
接收感谢: 9 次
联系:

Re: 求教:如何用vim递增替换。

#11

帖子 sunfish » 2011-04-18 16:10

me 2 22
sarrow
帖子: 403
注册时间: 2007-10-27 1:04
送出感谢: 0
接收感谢: 1 次

Re: 求教:如何用vim递增替换。

#12

帖子 sarrow » 2011-04-18 17:48

没有想到不用循环的方法。按你的要求,基本就是纯手工操作了。
用法——另存为一个文档,然后so。

" 需要设定一个其实值——当然也可以自己找。

if search('\<\d\.\D', 'cW')
let _reg_q_ = getreg('"')
normal yiw
let _number_ = str2nr(getreg('"'))
let _number_ += 1
execute "normal ciwa\<C-r>=string(_number_)\<CR>"
while search('\<'._number_.'\.\D', 'cW')
normal yiw
let _number_ = str2nr(getreg('"'))
let _number_ += 1
execute "normal ciwa\<C-r>=string(_number_)\<CR>"
endwhile
endif
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

Re: 求教:如何用vim递增替换。

#13

帖子 ytaome » 2011-04-19 11:30

我昨天想了想,其实只要global或者s命令的pattern部分能使用变量就可以了。后面的string部分可以用\=就好办了。
不晓得vim的正则表达式能不能包含变量。。
ytaome
帖子: 6
注册时间: 2011-04-15 15:52
送出感谢: 0
接收感谢: 0

Re: 求教:如何用vim递增替换。

#14

帖子 ytaome » 2011-04-19 11:32

nickdgd 写了:
eexpress 写了:
递增替换
我是被这名词忽悠进来的。
me 2
不太明白,大家所说的递增替换是什么含义?莫非我的“递增替换”歧义了?
回复

回到 “Vim和Emacs”