0809linux基础小记(sed和vim用法)

sed  [options] ‘scripts’ inputfile

-n: 不输出模式空间内容的自动打印

-e: 多点编辑

-f:从指定文件中读取编辑脚本

-i:原处编辑

scripts

地址命令

地址定界:

(1)  不给地址:对全文进行处理

(2)  单地址:

#:  指定的行

: sed '2d' f1  //删除第2

/pattern/ :被此处模式所能够匹配到的每一行

: sed -n '/^r/p' /etc/passwd   //打印以r开头的行

blob.png

(3)  地址范围:

#,#

: sed -n '9,12p' /etc/fstab  //打印第9~12

blob.png

#,+#

: sed -n '3,+4p' /etc/fstab  //打印从第3行开始,加后面的4

blob.png

/pat1/,/pat2/

: sed -n '/^root/,/^b/p' /etc/passwd  //打印以root开头的行到以b开头的行

blob.png

#,/pat1/

:sed -n '8,/^S/p' /etc/sysconfig/sshd   //打印第8行至以S开头的行

blob.png

(4) ~ :步进

1~2  奇数行

sed -n '1~2p' file   //显示奇数行

blob.png

2~2  偶数行

sed -n '2~2p' file   //显示偶数行

blob.png

 

 

 

  编辑命令:

d:  删除模式空间匹配的行

p:  显示模式空间中的内容

a \text :在行后面追加文本;支持使用\n 实现多行追加

i \text :在行前面插入文本;支持使用\n 实现多行插入

c \text :替换行为单行或多行文本

w /path/to/somefile:  保存模式匹配的行至指定文件

r /path/from/somefile :读取指定文件的文本至模式空间中匹配到的行后

=:  为模式空间中的行打印行号

!: 模式空间中匹配行取反处理

 

s/// :查找替换, 支持使用其它分隔符,s@@@ s### 替换标记:

g:  行内全局替换

p:  显示替换成功的行

w  /PATH/TO/SOMEFILE :将替换成功的行保存至文件中

 

:

sed -n -e '/export/p' -e '/^$/=' ~/.bash_profile

blob.png

 

sed '/root/a\hero\n\a\king' /etc/passwd|head -5

blob.png

 

 

sed '/root/i\superman' /etc/passwd|head -5

blob.png

sed '/^root/c\superman' /etc/passwd|head -3

blob.png

nl /etc/passwd|sed '2a tea'

blob.png

sed -n 's/^root\b/king&/p' /etc/passwd   单词补前缀

sed -n 's/^root\b/&king/p' /etc/passwd   单词补后缀

blob.png

 

sed -i.bak '2d' /tmp/passwd    原处改文件,并生成备份

blob.png

  高级编辑命令:

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:追加匹配到的行的下一行至模式空间

d: 删除模式空间中的行

D:删除当前模式空间开端至\n 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

 

记忆:hhold,进入模式空间;gglobal,进入模式空间;小写是覆盖;大写是追加

blob.png

sed '1!G;h;$!d' FILE  

1!G 第一行不执行G命令,从第二行开始执行从保持空间取出内容追加至模式空间

$!d 最后一行不删除

blob.png

blob.png

命令执行结果是倒序排列,效果同tac命令

sed -n '1!G;h;$p' num  // 倒序打印,效果同上

 

echo {1..10} |tr ' ' '\n' >  num    //num文件是十行,分别显示1~10

 

sed '$!N;$!D' num  // 打印倒数两行

$!N 除最后一行,追加匹配到的行的下一行至模式空间

$!D 除最后一行,删除当前模式空间开端至\n 的内容

blob.png

第一行1进模式空间,第一行的下一行(即第二行)2追加至模式空间,再模式空间中删除操作;

第一行3进模式空间,第三行的下一行(即第四行)4追加至模式空间,再模式空间中删除操作;

一直持续下去,直到第九行9进模式空间,第九行的下一行(即第十行)10追加至模式空间,

动作结束。此时模式空间中只有两行,910.

 

 

sed '$!d' num       // 只留最后一行

sed 'G' num        // 每行后增加空行

sed 'g' num        // 显示10个空行

sed '/^$/d;G' num   // 每行后有且只有一个空白行

sed 'n;d' num       // 打印奇数行

blob.png

 

 

sed -n 'n;p' num     // 打印偶数行

blob.png

sed  'n;p' num  输出如下图,包含显示出了模式空间的内容,printp动作打印出的内容

blob.png

 

 

vim [OPTION] FILE

+# 打开文件直接让光标处于第#行的行首

+/ PATTERN :打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首

blob.png

vim + file 直接打开文件,光标在末行行首

vim b file  二进制方式打开文件

vim -m file 只读打开文件

vim d file1 file2 比较多个文件    ctrl+两下w,多文件之间切换

blob.png

 

三种主要模式

命令模式(默认):移动光标,剪切/ 粘贴文本

插入(编辑)模式:修改文本

扩展命令模式 :保存,退出等

Esc   退出当前模式

Esc Esc

 

命令模式 –>  插入模式

i: insert,  在光标所在处输入

I :在当前光标所在行的行首 输入

a: append,  在光标所在处后面输入

A :在当前光标所在行的行尾 输入

o:  在当前光标所在行的下方插入一个新行

O :在当前光标所在行的上方插入一个新行

插入模式 ESC命令模式

命令模式  :  >  扩展 模式

扩展模式 ESC > 命令模式

锁定和解锁:CTRL+s,Ctrl+q

 

扩展模式:

:q  退出

:q!  强制退出,丢弃做出的修改

:wq  保存退出

😡  保存退出

命令模式

ZZ:  保存退出

ZQ: 不保存退出

 

命令:

写(存)磁盘文件

wq  写入并退出

写入并退出

q 退出

q!不存盘退出,即使更改都将丢失

r filename  读文件内容到当前文件中

blob.png

w filename 将当前文件内容写入另一个文件

blob.png

!command

blob.png

r!command

blob.png

 

字符间跳转:

h:  l:  j:  k:

#COMMAND :跳转由# 指定的个数的字符;如20l,右移20个字符

单词间跳转:

w :下一个单词的词首

e :当前或下一单词的词尾

b :当前或前一个单词的词首

#COMMAND :由# 指定一次跳转的单词数;如5e,往后移动5个词

当前页跳转:

H :页首   M :页中间行   L: 页底

 

行首行尾跳转:

^:  跳转至行首的第一个非空白字符;

0:  跳转至行首

$:  跳转至行尾

行间移动:

#G 、扩展模式:跳转至由# 指定行;5G,跳到第5

G :最后一行

1G, gg:  第一行

句间移动:

) :下一句  ( :上一句

段落间移动:

}: 下一段  {: 上一段

 

Ctrl+f:  向文件尾部翻一屏

Ctrl+b:  向文件首部翻一屏

Ctrl+d:  向文件尾部翻半屏

Ctrl+u:  向文件首部翻半屏

 

字符编辑:

x:  删除光标处的字符;

#x:  删除光标处起始的# 个字符

xp:  交换光标所在处的字符及其后面字符的位置

~: 转换大小写

替换命令(r, replace)

r:  替换光标所在处的字符

R: 切换成REPLACE


删除命令:

d:  删除命令,可结合光标跳转字符,实现范围删除;

d$: 删除到行尾

d^: 删除 到非空行首

d0: 删除到行首

dw:

de:

db: 删除前个词

#COMMAND

dd:  删除光标所在的行

#dd :多行删除

D:从当前光标位置一直删除到行尾 ,留空行,等同于d$

J: 将下一行拼接至本行

 

复制命令(y, yank)

y:  复制,行为相似于d 命令

y$

y0

y^

ye

yw

yb

#COMMAND

yy :复制行

#yy:  复制多行

Y: 复制整行

 

粘贴命令(p, paste)

p :缓冲区存的如果为整行,则粘贴当前光标所在行的下方;

否则,则粘贴至当前光标所在处的后面

P :缓冲区存的如果为整行,则粘贴当前光标所在行的上方;

否则,则粘贴至当前光标所在处的前面

改变命令(c, change)

c:  修改后切换成插入模式

命令模式 –>  插入模式

c$

c^

c0

cb

ce

cw

#COMMAND

cc :删除当前行并输入新内容

#cc:

C:删除当前光标到行尾,并切换成插入模式

 

10igood [ESC]  粘贴“good 100

 <start position><command><end position>

 Command:

复制、删除、gU  变大写、gu  变小写

例如 0y$  命令意味着:

0   先到行头

y   从这里开始拷贝

$   拷贝到本行最后一个字符

ye  从当前位置拷贝到本单词的最后一个字符

 

地址定界

:start_pos,end_pos

#:  具体第# 行,例如2 表示第2 行;

#,#:  从左侧# 表示行起始,到右侧# 表示行结尾

#,+#:  从左侧# 表示的行起始,加上右侧# 表示的行数

2,+3 表示2 5

.:  当前行

$: 最后一行

.,$-1  当前行到倒数第二行

% :全文相当于1,$

 

/pat1/,/pat2/

从第一次被pat1 模式匹配到的行开始,一直到第一次被pat2 匹配到的行结束

#,/pat/

blob.png

/pat/,$

使用方式:后跟一个编辑命令

d

y

w file:  将范围内的行另存至指定文件中

r file:在指定位置插入指定文件中的所有内容

 

查找

/PATTERN :从当前光标所在处向文件尾部查找

?PATTERN :从当前光标所在处向文件首部查找

n:与命令同方向

N:与命令反方向

 

s:  在扩展模式下完成查找替换操作

格式:s/ 要查找的内容/ 替换为的内容/ 修饰符

要查找的内容:可使用模式

替换为的内容:不能使用模式,但可以使用\1, \2, …

等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容

修饰符:

i:  忽略大小写

g:  全局替换;默认情况下,每一行只替换第一次出现

gc: 全局替换,每次替换前询问

查找替换中的分隔符/ 可替换为其它字符,例如

s@/etc@/var@g

s#/boot#/#i

 


1.复制/etc/profile /tmp/ 目录,用查找替换命令删除/tmp/profile 文件中的行首的空白

 字符

 cp /etc/profile /tmp

 sed 's#^[[:space:]]\+##' /tmp/profile

 

2. 复制/etc/rc.d/init.d/functions 文件至/tmp 目录,用查找替换命令为/tmp/functions 

 的每行开头为空白字符的行的行首添加一个#

    cp /etc/rc.d/init.d/functions  /tmp

    vim /tmp/functions

    :%s@^[[:space:]]\+@#&@g

 

 

u 撤销最近的更改

#u 撤销之前多次更改

U  撤消光标落在这行后所有此行的更改

Ctrl – r 重做最后的“撤消”更改

重复前一个操作

n. 重复前一个操作n

 

 

26 个命名寄存器和1 个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。

a b,…,z 表示, 用“ 寄存器表示,放在数字和命令之间

如:3"tyy  表示复制3 行到t 寄存器中

"tp 表示将t 寄存器内容粘贴

未指定,将使用无命名寄存器

10 个数字寄存器,用0 1 ,… 9 表示,0 存放最近复制内容,1 存放最近删除内容。当新的文本变更和删除时,1 转存到2 2 转存到3 ,以此类推。数字寄存器不能在不同会话间共享。

 

 

以二进制方式打开文件

vim -b binaryfile

扩展命令模式下,利用xxd 命令转换为可读的十六进制

:%!xxd

编辑二进制文件

扩展命令模式下,利用xxd 命令转换回二进制

:%!xxd –r

保存退出

 

 

允许选择的文本块

v面向字符

V面向行

ctrl-v  面向块

可视化键可用于与移动键结合使用:

w    }  箭头等

突出显示的文字可以被删除,复制,变更,过滤,搜索 / 替换等

 

 

vim FILE1 FILE2 FILE3 …

:next  下一个

:prev  前一个

:first  第一个

:last  最后一个

:wall  保存所有

:qall  退出所有

:wqall

 

 

多文件分割

vim -o|-O FILE1 FILE2 …

-o:  水平分割

-O:  垂直分割

blob.png

在窗口间切换: Ctrl+w, Arrow

单文件窗口分割:

Ctrl+w,s: split,  水平分割

Ctrl+w,v: vertical,  垂直分割

ctrl+w,q :取消相邻窗口

ctrl+w,o: 取消全部窗口

wqall 退出

 

 

配置文件:永久有效

全局:/etc/vimrc

个人:~/.vimrc

扩展模式:当前vim 进程有效

(1)  行号

显示:set number,  简写为set nu

取消显示:set nonumber,  简写为set nonu

(2)  括号成对匹配

匹配:set showmatch,  简写为set sm

取消:set nosm

(3)  自动缩进

启用:set ai

禁用:set noai

(4)  高亮搜索

启用:set hlsearch

禁用:set nohlsearch

(5)  语法高亮

启用:syntax on

禁用:syntax off

(6)  忽略字符的大小写

启用:set ic

不忽略:set noic

(7)  文件格式

启用: fileformat=unix

不忽略: fileformat=dos

(8)  设置文本宽度

:set textwidth=65 (vim only)

:set wrapmargin=15

 

:help option-list

:set or :set all

 

vi/vim 内置帮助

:help

:help topic

Use :q to exit help

vimtutor 练习册

 

 

1.如何设置tab 缩进为4 个字符?

:set ts=4

2.复制/etc/rc.d/init.d/functions 文件至/tmp 目录;替换/tmp/functions

文件中的/etc/sysconfig/init /var/log

:%s@/etc/sysconfig/init@/var/log@g

blob.png

3.删除/tmp/functions 文件中所有以# 开头,且# 后面至少有一个空白字符的行的行首的#

:%s@^#\([[:space:]].*\)@\1@

 

原创文章,作者:victorycommander,如若转载,请注明出处:http://www.178linux.com/33065