Chinaunix

标题: 关于Vim的文本替换问题 [打印本页]

作者: gao86    时间: 2008-12-16 22:23
标题: 关于Vim的文本替换问题
我在使用Vim时编辑文本时,
遇到如: a[0],b[0],...
           a[0],b[0],...
            .
            .
我想把它们改成a[0],b[0],...
                     a[1],b[1],...
                      .
                      .  
就是十多行相同的a[0],b[0],...我想改变括号中数字,让它逐行递增.
请问我该怎么做?
手工的方法,也是我没办法才用的.

谢谢回复我的人.

我用  Ns/\d/\=line(".")-N/gM.
N为从第N行开始,如果放空则为从光标的开始.
M为执行次数.
如:
行号
1
2    a[0],b[0],c[0],...
3    a[0],b[0],c[0],...   
4    a[0],b[0],c[0],...
5     

:2s/\d/\=line(".")-2/g3

我就可以把从第2行开始到第4行改成

行号
2   a[0],b[0],c[0];
3   a[1],b[1],c[1];
4   a[2],b[2],c[2];
5

当然了,如果是

行号
2    a[0],b[0],c[0],...
3   
4    a[0],b[0],c[0],...   
5    a[0],b[0],c[0],...
     
就会变成

行号
2  a[0],b[0],c[0];
3
4  a[2],b[2],c[2];
5  a[3],b[3],c[3];

a里的i=="行号-2"

[ 本帖最后由 gao86 于 2008-12-17 22:31 编辑 ]
作者: walkerxk    时间: 2008-12-16 22:25
规律?
作者: changzi100    时间: 2008-12-16 22:26
1,手工替换

2,用正则表达式替换

3,自己写个脚本替换
作者: gao86    时间: 2008-12-16 22:31
标题: 回复 #2 walkerxk 的帖子
就是十多行相同的a[0],b[0],...我想改变括号中数字,让它逐行递增.
作者: gao86    时间: 2008-12-16 22:32
标题: 回复 #3 changzi100 的帖子
如果数量太多,手工我觉得太麻烦,
你建议的2,3 两点,能否提示我该怎么做?
谢谢.
作者: walkerxk    时间: 2008-12-16 22:35
你的意思是
原来是:
a[0],b[0],
a[0],b[0],
a[0],b[0],
然后你要替换成
a[0],b[0],
a[1],b[1],
a[2],b[2],

a,b,
这个i和行数有关系么?还是从上面找下来是第几个就是几?

[ 本帖最后由 walkerxk 于 2008-12-16 22:36 编辑 ]
作者: gao86    时间: 2008-12-16 22:36
标题: 回复 #6 walkerxk 的帖子
我想从任意行中比如从第3行开始连续的10行a[0],b[0],我要把它改成a[0],b[0],a[1],b[1],...a[9],b[9].

[ 本帖最后由 gao86 于 2008-12-16 23:11 编辑 ]
作者: huwenhuo    时间: 2008-12-16 22:43
%s/^/\=line(".")." "/
作者: huwenhuo    时间: 2008-12-16 22:43
%s/\d/\=line(".")-1/

[ 本帖最后由 huwenhuo 于 2008-12-16 22:47 编辑 ]
作者: gao86    时间: 2008-12-16 22:53
标题: 回复 #9 huwenhuo 的帖子
你好,谢谢你的回复
用你的方法如果
a[0],b[0],在第一行可以改成a[1],b[0],
                                     a[2],b[0],
                                     a[3],b[0],
但b[0]没有改到.

而a[0],b[0],里a[0]的0是被改成"行号数减去1",如果不是在第一行,如第5行就会被改成a[4],b[0]了.

[ 本帖最后由 gao86 于 2008-12-16 23:06 编辑 ]
作者: walkerxk    时间: 2008-12-16 22:56
原帖由 gao86 于 2008-12-16 22:53 发表
你好,谢谢你的回复
用你的方法的可以改成a[1],b[0],
                                     a[2],b[0],
                                     a[3],b[0],
但b[0]没有改到.

%s/\d/\=line(".")-1/g
但是这种办法是把所有数字都改掉,而且你的a[0]是每行一个?
作者: gao86    时间: 2008-12-16 23:21
标题: 回复 #11 walkerxk 的帖子
谢谢你的回复,
按照你的方法改完后是可以都改,但还是有问题第一个a[0],b[0],里的0是被改成"行号数减去1"的,
如果不是在第一行,如第5行就会被改成a[4],b[4]了.
作者: kns1024wh    时间: 2008-12-16 23:38
标题: 回复 #1 gao86 的帖子
:%s/源内容/替换内容/g
作者: qzdmail    时间: 2008-12-16 23:53
正则表达式好深奥哦
唉..我是不会了


作者: walkerxk    时间: 2008-12-17 00:18
i=0
while read l
do
echo $l|sed "s,a\[0\],a\[$i\],;s,b\[0\],b\[$i\],"
[[ $l =~ a\[0\] ]]&&((i++))
done<urfile
要求是a[0]和b[0]成对出现。
作者: gao86    时间: 2008-12-17 21:37
标题: 回复 #15 walkerxk 的帖子
对于你所写的我看不懂,不过,我已经有点知道我该怎么做了
作者: gao86    时间: 2008-12-17 21:49
谢谢回复我的人.

我用  Ns/\d/\=line(".")-N/gM.
N为从第N行开始,如果放空则为从光标的开始.
M为执行次数.
如:
行号
1
2    a[0],b[0],c[0],...
3    a[0],b[0],c[0],...   
4    a[0],b[0],c[0],...
5     

:2s/\d/\=line(".")-2/g3

我就可以把从第2行开始到第4行改成

行号
2   a[0],b[0],c[0];
3   a[1],b[1],c[1];
4   a[2],b[2],c[2];
5

Vim实在是太神奇了!
作者: walkerxk    时间: 2008-12-17 21:55
s,a\[0\],a\[$i\],
把a[0]替换成a[$i]
[[ $l =~ a\[0\] ]]&&((i++))如果含有a[0],那么i就+1
作者: walkerxk    时间: 2008-12-17 21:56
原帖由 gao86 于 2008-12-17 21:49 发表
谢谢回复我的人.

我用  Ns/\d/\=line(".")-N/gM.
N为从第N行开始,如果放空则为从光标的开始.
M为执行次数.
如:
行号
1
2    a[0],b[0],c[0],...
3    a[0],b[0],c[0],...   
4    a[0],b[0],c[0],. ...

但是如果第二行有,第三行为空呢?
作者: gao86    时间: 2008-12-17 22:21
标题: 回复 #19 walkerxk 的帖子
是的,我这个只适合连续行,但对于我来说已经够用了
作者: walkerxk    时间: 2008-12-17 22:37
恩,够用就好,没有最好,只有最适合。
作者: lfree    时间: 2008-12-19 09:21
下载
increment.vim插件
作者: lzs45    时间: 2008-12-19 22:38
原帖由 kns1024wh 于 2008-12-16 23:38 发表
:%s/源内容/替换内容/g



我严重怀疑你没有仔细看LZ的帖子和别人的回复
作者: gobbin    时间: 2008-12-19 22:38
学习学习




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2