早教吧 育儿知识 作业答案 考试题库 百科 知识分享

vim中,下面的删除偶数行的正则表达式为什么不一样呀?123456789上面的九个数是测试文本,共九行.:%s/\s*//g表示删除每行的空格:%normjdd表示删除偶数行,其中表示空格,但是我不小心,输成了:%n

题目详情
vim中,下面的删除偶数行的正则表达式为什么不一样呀?
1
2
3
4
5
6
7
8
9
上面的九个数是测试文本,共九行.
:%s/\s*//g 表示删除每行的空格
:%normjdd 表示删除偶数行,其中表示空格,但是我
不小心,输成了:%normjdd
两条命令合起来就是
:%s/\s*//g|%normjdd (这个是错误的)
(写成看不见的空格的形式就是:%s/\s*//g|%norm j dd ,记成命令组A)
结果就成了保留第1\2\4\6\8行,
如果增加行尾空格,用
:%s/$/\s/g|%normjdd
(看不见的空格的形式就是:%s/$/ /g|%norm j dd ,记成命令组B)
结果是保留了第1\3\5\7\9行,也就是我想要的结果
我想问的是命令组A与命令组B为什么会不一样呀?不都是先向下
移动一行然后删除本行,再向下移动一行再删除本行,如此不断
还有就是正确的命令
:%s/\s*//g|%norm jdd (这个是删除每行空格)
:%s/$/ /g|%norm jdd (这个是增加每行行尾空格)
这两个命令都能正确地删除偶数行.
还有,删除奇数行是什么正则表达式呀?
▼优质解答
答案和解析
%normal 的命令从没用过.不过从你这个命令来看,实在是很没谱啊.
我估计是bug了.要么就是第一次空格有效,后面的空格都是无效的了.
你前面那个替换没什么用.去不去掉空格增加空格都没有影响.
normal j dd 就是下移一行,再向后一个字符,再删除.顺序的操作. 如果这一行就1个字符的话,就跳到下一行了.
重复执行,那个空格可能被省略了吧.
建议normal 命令不用%来做.
给你2个命令:
删除偶数行:
%s/\(^.*$\)\n^.*$/\1/g
删除奇数行:
%s/^.*$\n\(^.*$\)/\1/g
很好理解,就是把2行正则match,替换成其中1行.