vi vim

实践:

1、

cat ~/bash.bashrc > a.sh
cat a.sh >  ~/bash.bashrc
 
 
  Vim可以用正则排序.
 Vim 有什么奇技淫巧? - 知乎 https://www.zhihu.com/question/27478597

 


Vim命令_Linux Vim命令:替换文本内容 http://c.biancheng.net/linux/Vim.html

Vi 的历史非常悠久,可以追溯到 1976年,那时,一个叫作 Bill Joy 的美国兄弟编写了一款行编辑器工具,叫 ex,在当时非常的出名。但是,经过对用户行为的观察,Joy 发现人们更愿意使用 ex 的可视化模式,而非行编辑模式。因此,Joy 决定在 1979 年发布 Vi 这款编辑器,直接把可视化模式(Visual Mode)呈现给用户。正是这个决定造就了今天家喻户晓的 Vi 编辑器。而 Joy 后来成为了 Sun 公司的创始人之一,并担任公司首席科学家直到 2003 年。

虽然 Vi 历史悠久,但是要说群众基础,还是 Vim 更胜一筹。Vim 是由一位荷兰牛人开发的可视化文本编辑器。起初,他对 Vim 的定位并不高,从他给这款产品命名 Vi IMitation 就能看得出来。而后来由于加入的特性越来越多,也越来越受到人们的喜爱和欢迎,因此他也顺势将 Vim 的名字全称改为了 Vi IMproved,意为 Vi 的增强版本,看来英文也是博大精深啊。

这位开发了 Vim 的荷兰人,叫作布莱姆·米勒(Bram Moolenaar),他不仅一直在不计酬劳地为开源事业做着贡献,而且还持续资助乌干达改善儿童教育和医疗水平。同时,他还是一个相当有趣的人,在他的个人主页上,他用数十种语言写出了他的名字“米勒”。

说到 Vim 与 Vi 的关系,可以确定的是 Vi 的所有功能几乎都已经囊括到了 Vim 中,同时 Vim 较 Vi 的优势和亮点也是不胜枚举的,比如:

  • Vim 支持更多语言的语法高亮。
  • Vim 支持更多的操作系统和平台,包括 UNIX/Linux、Windows、MAC 等。
  • Vim 支持强大的插件功能。
  • Vim 支持通过 SSH/HTTP 方式的远程文本编辑功能。
  • Vim 支持多层级的 undo 和 redo。
  • Vim 可以直接编辑压缩包(gzip、bzip2、zip)中的文件。


如果套用一句苹果的广告语,那就是:“唯一的不同,是处处都不同!”

由于 Vim 使用的广泛性,本文下面内容中出现的 Vi 都是指代 Vim。

基础替换用法

在 Vi 的普通模式下,先输入冒号(:),进入命令行模式,这是 Vi 做一切替换操作的前提。

假如我们想将 abc 替换为 xyz,那么就这样:

:s/abc/xyz/


不过要特别注意,这个替换没有你想象得那么顺利,因为它只能针对光标当前所在行进行替换,而且更糟糕的是,它只替换当前行中第一个匹配到的 abc。

举个例子,如果此行内容为“I write abc,I read xyz and abc.”。那么替换后的结果为“I write xyz,I read xyz and abc.”。

接下来,我们的改进方案来了,请注意,我们在替换命令的最后面加上了 g 这个字母:

:s/abc/xyz/g


这样可以实现在光标所在行,对所有匹配到的 abc 都替换为 xyz。继续举这个例子,如果此行内容为“I write abc,I read xyz and abc.”。那么替换后的结果为“I write xyz,I read xyz and xyz.”。

可惜的是,这个方案仍局限在光标所在行,还是无法替换文件中所有行中的 abc。所以,我们的方案继续改进,我们在替换命令的最前面加上了“1,$”的表达式:

:1,$s/abc/xyz/g


其实我们可以在替换命令的最前面加上类似“m,n”格式的表达式,来表示替换动作所能影响到的行范围,1 表示第一行,$ 表示最后一行。当然你也完全可以指定其他行范围,比如,10,50s/abc/xyz/g 就表示只替换第 10 行到第 50 行中的 abc。

在这里再教你一个小技巧,如果你想做全文替换,写 1,$ 要三个字符,而用 % 来代替,只需要一个字符,所以我们的替换命令可以改写为:

:%s/abc/xyz/g

转义替换

如果想将当前行里所有的“S.”替换为“S->”,就需要用到转义符了,正确的写法是这样的:

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


我们假设当前行的内容是:

S.abc and S->bcd and S.aaa and S..abc


替换后会变为:

S->abc and S->bcd and S->aaa and S->.abc


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

连间隔符都可以改变

如果你要匹配和替换“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

最复杂的压轴

如果我希望在含有日期格式(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 处就会被替换过来,外面再加一对引号,就完成了!

Vim 的替换,包含的知识点和技巧远不止本文所提及的内容,还有非常多的知识等待着大家去学习和积累。

 

 


将全文中19.18.12.13替换为20.21.22.23

:1,$s/19\.18\.12\.13/20\.21\.22\.23/g

 

 

 

 

hjkl光标四方向

排序前
[A]a
[B]b
[C]c
[A]a1
[B]b1
[C]c1
[A]a2
[B]b2
[B]b3
[C]c3
[XA]xa
[C]c4 

[XA]xa1

排序后
[A]a
[A]a1
[A]a2
[B]b
[B]b1
[B]b2
[B]b3
[C]c
[C]c1
[C]c3
[C]c4
[XA]xa
[XA]xa1
好玩的--
其他编辑器--软件怎么处理?
https://www.zhihu.com/question/27478597


引入主题:提问Q为什么 :wq! :wq  二者结果一致?
-1-引入nokia的一款手机 指出 vi_vim的表观理念:摆脱鼠标且尽量使用键盘字母键和数字键,仅依靠ESC
设计特征:强化词和行的地位,词和行为常用“操作元”
0- vi /var/www/w.php
	vim /var/www/w.php
	界面一样
注意:执行该命令后,怎么退出?
进入insert--->ESC--->:q


1-通过ESC切换单个字母的编辑命令
a      //在当前光标位置的右边添加文本
i       //在当前光标位置的左边添加文本
A     //在当前行的末尾位置添加文本
I      //在当前行的开始处添加文本(非空字符的行首)
O     //在当前行的上面新建一行
o     //在当前行的下面新建一行
R    //替换(覆盖)当前光标位置及后面的若干文本
J    //合并光标所在行及下一行为一行(依然在命令模式)

x         //删除当前字符
nx         //删除从光标开始的n个字符
dd      //删除当前行
ndd   //向下删除当前行在内的n行
u       //撤销上一步操作
U      //撤销对当前行的所有操作




2-强化练习
/vpser     //向光标下搜索vpser字符串
?vpser     //向光标上搜索vpser字符串
n           //向下搜索前一个搜素动作
N         //向上搜索前一个搜索动作

3-(特色)跳至指定行
n+        //向下跳n行
n-         //向上跳n行
nG        //跳到行号为n的行
G           //跳至文件的底部2017/3/242017/3/24

4-(常用)行号
:set  nu     //显示行号 
:set  number     //显示行号 
:set nonu    //取消显示行号
:set nonumber    //取消显示行号

6-常用功能中,其他编辑器逊色的vi_vim出色之处---高效
高效的复制粘贴
yy    //将当前行复制到缓存区,(待well验证---->)也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
nyy   //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
yw    //复制从光标开始到词尾的字符。
nyw   //复制从光标开始的n个单词。
y^      //复制从光标到行首的内容。  VPS侦探
y$      //复制从光标到行尾的内容。
p        //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用"ap 进行粘贴。
P        //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用"aP 进行粘贴。

:s/old/new      //用new替换行中首次出现的old
:s/old/new/g         //用new替换行中所有行中首次出现的old
:n,m s/old/new     //用new替换从n到m行里所有的old
:n,m s/old/new/g     //用new替换从n到m行里所有的old
:%s/old/new/g      //用new替换当前文件里所有的old
:%s/old/new       //用new替换当前文件里所有行中首次出现的old

注意和u结合,撤销前一步的操作(或前一步的前一步)操作

我们用自然语言的方式来理解一些简单的命令序列。
动词+修饰词(可选)+名词
d(delete)3w(word)    删除三个词--->(待验证)
d(delete)5j(lines)     删除1+5行(包括当前行)
c(hange)w(word)    替换一个词--->(待验证)
d(delete)t(till){    删除直到{字符之前
d(delete)i(inside)p(paragraph)     删除一个段落
z(scroll)t(top)    当前光标行滚动到顶部
z(scroll)b(bottom)     当前光标行滚动到底部

直接的操作前面可以加数字修饰
33G(Goto)    跳转到33行
6j(down)      光标下移6行

7-文件保存 命名 管理
Q为什么 :wq! :wq  二者结果一致?


:w filename 另存为filename;
:q 执行失败--->提示-已经修改,但是尚未保存,+!强制不保存退出

:w 保存;
:wq! 保存退出;
:wq 保存退出;--->疑问

:wq! filename 注:以filename为文件名保存后退出;
:q! 不保存退出;
:x 应该是保存并退出 ,功能和:wq!相同
ZZ:若文件没有更动,则不保存离开,若文件已经被更改过,则保存后离开


:e otherfilename    //编辑文件名为otherfilename的文件。  相对路径

8-编码
:set spell 拼写检查
:set scrolloff=3  滚动
:set cursorline 水平线
:set incsearch 增量搜索

 
[A]a
[B]b
[C]c
[A]a1
[B]b1
[C]c1
[A]a2
[B]b2
[B]b3
[C]c3
[XA]xa
[C]c4
[XA]xa1

:1,13!sort
:.,+12!sort
:%sort


 
22]a
123]b
457]c
22]a1
123]b1
457]c1
22]a
123]b
457]c
22]a1
123]b1
457]c1
22]a2
123]b2
123]b3
457]c3
9]xa
457]c4
9]xa1
22]a2
123]b2
123]b3
457]c3
9]xa
457]c4
9]xa1
去重 
:%sort u
:sort n

1 j 124.63 172 0.72
2 e 99.67 172 0.58
3 r 93.34 188 0.50
4 r 41.86 188 0.22
5 a 26.68 188 0.14
6 e 18.25 188 0.10
7 u 18.25 188 0.10
8 t 11.89 164 0.07
9 m -16.55 156 -0.11
10 q -16.19 152 -0.11
11 v -86.73 152 -0.57
12 b -213.45 152 -1.40

:sort /\d/ r
:%sort /\d/ r

:sort /[a-z]/ r



-r 是降序排序
-n 是按数字大小排序
-k,表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束
-t 后面跟分隔符,缺省是空格


-c --check 只检查文件是否已排序,而不进行排序。

-m --merge 合并已经排好序的文件。

-o --output=FILE 将排序结果保存到指定文件中,通常用于将结果保存到原文件中(这种情况用输出重定向不能完成)。

-s --stable sort命令默认是不稳定的排序,此选项使排序结果稳定。

-u --unique 对排序键值相同的行只保留一行。默认情况下,sort | uniq等效于sort -u,但是在指定了排序key时则不同。

-b --ignore-leading-blanks 忽略前导空格。

-R --random-sort 随机排序,每次运行的结果均不同。

-n --numeric 按字符串的数值来比较。

-r --reverse 倒序排序。

-t --field-separator=SEP 设置字段分隔符,默认的分隔符是non-blank to blank transition。

-f --ignore-case 开启此选项则忽略大小写进行比较。

然而,有可能在Linux中,默认情况下已经是忽略大小写的排序了,这是因为locale的原因。sort命令的帮助中有如下警告:

 WARNING  The locale specified by the  environment  affects  sort  order.  Set LC_ALL=C to get the traditional sort order that uses native byte values.
sort命令会根据当前的locale来决定一些字符串的比较结果,这样,在不同的机器中,即使输入数据相同,也有可能因为locale不同而导致排序结果不同。因此,如果排序结果不符合预期的话,不妨echo $LC_ALL看看是否为C,如果不是,可以执行export LC_ALL=C。

-k --key=KEYDEF 指定排序key,格式为F[.C][OPTS][,F[.C][OPTS]]。

例如sort -t: -k2,2n -k4,4nr input.txt表示以冒号为分隔符,首先以数值方式比较第二列,如果相同,再以逆序数值方式比较第四列,列数是从1开始的。而sort -k2.1,2.2 input.txt表示比较第二列的前两个字符来排序。

key的结束位置默认为行尾,因此sort -k2 input.txt表示的是比较第二列开始到行尾的字符串,而不仅仅是第二列。因此,如果需要,尽量定义多个key,而不是一个跨列的key。

reference
http://www.skorks.com/2010/05/sort-files-like-a-master-with-the-linux-sort-command-bash/

alan@alan-ubuntu-vm:~/tmp/sort$ sort letters.txt


$ nl --help
Usage: nl [OPTION]... [FILE]...
Write each FILE to standard output, with line numbers added.

With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
-b, --body-numbering=STYLE use STYLE for numbering body lines
-d, --section-delimiter=CC use CC for logical page delimiters
-f, --footer-numbering=STYLE use STYLE for numbering footer lines
-h, --header-numbering=STYLE use STYLE for numbering header lines
-i, --line-increment=NUMBER line number increment at each line
-l, --join-blank-lines=NUMBER group of NUMBER empty lines counted as one
-n, --number-format=FORMAT insert line numbers according to FORMAT
-p, --no-renumber do not reset line numbers for each section
-s, --number-separator=STRING add STRING after (possible) line number
-v, --starting-line-number=NUMBER first line number for each section
-w, --number-width=NUMBER use NUMBER columns for line numbers
--help display this help and exit
--version output version information and exit

By default, selects -v1 -i1 -l1 -sTAB -w6 -nrn -hn -bt -fn.
CC are two delimiter characters used to construct logical page delimiters,
a missing second character implies :. Type \\ for \. STYLE is one of:

a number all lines
t number only nonempty lines
n number no lines
pBRE number only lines that contain a match for the basic regular
expression, BRE

FORMAT is one of:

ln left justified, no leading zeros
rn right justified, no leading zeros
rz right justified, leading zeros

 

 在编辑模式下输入
ngg 或者 nG
n为指定的行数(如25)
25gg或者25G 跳转到第25行.


在命令模式下输入行号n
: n 跳转至第n行


如果想打开文件即跳转
vim +n FileName
查看当然光标所在的行
Ctrl+g

 

 

删除全文

删除

vim如何删除文件中所有东西

vim删除文件中所有内容的方法:
(:代表要切换到命令模式输入:之后的命令)
(1):%d
不管光标在哪里,删除所有
(2)gg dG
gg的意思是光标切换到第一行

 

 
posted @ 2017-03-25 16:29  papering  阅读(353)  评论(0编辑  收藏  举报