sed 和 vim 的 用法

处理文本的工具 三剑客之 sed


sed是一种流编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容 ,处理完成后,把缓冲区的内容送往屏幕。接着处理下一 行,这样不断重复,直到文件末尾。文件内容并没有改变 ,除非你使用重定向存储输出。Sed主要用来自动编辑一 个或多个文件,简化对文件的反复操作,编写转换程序等


sed 的 用法


sed [option]… 'script' inputfile…  

常用选项: 

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

-e: 多点编辑 

-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本 

-r: 支持使用扩展正则表达式 

-i: 原处编辑 script: '地址命令'


关于地址界定 有以下几种 表现方式


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

(2) 单地址: #: 指定的行 /pattern/:被此处模式所能够匹配到的每一行 

(3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/ 

(4) ~:步进 1~2 奇数行 2~2 偶数行


扩展模式的地址定界


:start_pos,end_pos 

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

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

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

:2,+3  表示2到5行 

.: 当前行 $: 最后一行 

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

%:全文, 相当于1,$


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

#,/pat/ 

/pat/,$  

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

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

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



sed 的 编辑命令选项有:


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

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

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

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

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

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

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

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

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


sed 的查找替换模式


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


g: 行内全局替换 

p: 显示替换成功的行 

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


sed高级编辑命令


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

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

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

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

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

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

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

d: 删除模式空间中的行 

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


sed高级编辑命令的一些示例


sed -n 'n;p' FILE

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

sed '$!N;$!D' FILE

sed '$!d' FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed 'n;d' FILE

sed -n '1!G;h;$p' FILE



vim 文本编辑器


vim的 特点以及难点在于 三种模式之间的转换 和三种模式中的 命令选项


vim的三种主要模式: 命令模式(默认):移动光标,剪切/粘贴文本 插入(编辑)模式:修改文本 扩展命令模式:保存,退出等 


三种模式之间的切换分别为


插入模式 —-> 命令模式 ESC  

命令模式 —-> 扩展模式 :  

扩展模式 —-> 命令模式 ESC  

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


第一种命令模式


# vim [OPTION]… FILE… 

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

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

  vim + file 直接打开file,光标在最后一行 

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

  vim –d file1 file2…  比较多个文件 

  vim  -m file  只读打开文件

  ex  file 或 vim –e  直接进入ex模式 如果该文件存在,文件被打开并显示内容 如果该文件不存在,当编辑后第一次存盘时创建它


第二种插入模式


命令模式 –> 插入模式 

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

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

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

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

  o: 在当前光标所在行的下方打开一个新行 

  O:在当前光标所在行的上方打开一个新行


第三种扩展命令模式


按“:”进入Ex模式 创建一个命令提示符:,处于底部的屏幕左侧  

命令: 

 w 写(存)磁盘文件 

 wq 写入并退出 

 q  退出 

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

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

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


 命令模式下的光标跳转

 字符间跳转: 

   h: 左 

   l: 右 

   j: 下 

   k: 上 

   #COMMAND:跳转由#指定的个数的字符;  

 单词间跳转: 

  w:下一个单词的词首 

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

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

   #COMMAND:由#指定一次跳转的单词数  

 当前页跳转: 

  H:页首 

  M:页中间行 

  L:页底


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

  0: 跳转至行首 

  $: 跳转至行尾  

 行间移动: #G、

 扩展模式:# :跳转至由#指定行 

  G:最后一行 

  1G, gg: 第一行  

 句间移动: 

  ):下一句 

  (:上一句  

 段落间移动: 

  }:下一段 

  {:上一段


翻屏操作


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

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

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

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


关闭文件


扩展模式: 

  :q 退出 

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

  :wq 保存退出 

  😡 保存退出  


命令模式 

  ZZ: 保存退出 

  ZQ:不保存退出


命令模式操作下的粘贴 复制 删除 替换 修改


字符编辑之删除和替换


字符编辑: 

  x: 删除光标处的字符; 

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

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

  ~:转换大小写


删除命令: 

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

  d$: 删除到行尾 d^:删除到非空行首 

  d0:删除到行首 dw: 

  de: 

  db: #COMMAND

  dd: 删除光标所在的行 #dd:多行删除

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

 

替换命令(r, replace) 

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

  R:切换成REPLACE模式


编辑之复制命令


复制命令(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:删除当前光标到行尾,并切换成插入模式


Command: y 复制、d 删除、gU 变大写、gu 变小写 



扩展模式下的查找与替换



查找 

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

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

n:与命令同方向 

N:与命令反方向


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


格式:

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

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

替换为的内容:不能使用模式,但可以使用\1, \2, … 等后向引用符号;还可以使用“&”引用前面查找时查找到的整 个内容 

修饰符: 

   i: 忽略大小写 

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

   gc:全局替换,每次替换前询问 查找替换中的分隔符/可替换为其它字符,

   例如 s@/etc@/var@g s#/boot#/#i


命令模式的撤销和更改


  1 u撤销最近的更改

  2 #u撤销之前多次更改

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

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

  5 . 重复前一个操作

  6 n.重复前一个操作n次



vim的寄存器


有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  

 保存退出



vim的可视化模式


允许选择的文本块 

v 面向字符 

V 面向行 

ctrl-v 面向块  

可视化键可用于与移动键结合使用: w, ) , } ,箭头等  

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


多文件多窗口模式


vim FILE1 FILE2 FILE3 … 

  :next 下一个 

  :prev 前一个 

  :first 第一个 

  :last 最后一个 

  :wall 保存所有 

  :qall 退出所有 

  :wqall


 多文件分割 vim -o|-O FILE1 FILE2 … 

   1 -o: 水平分割 

   2 -O: 垂直分割 在窗口间切换:Ctrl+w, Arrow  


 单文件窗口分割: 

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

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

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

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

   5 :wqall 退出


 vim的 私人订制


 配置文件:永久有效 

   全局:/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

   


   vim的内置帮助的文档


   vi/vim内置帮助 :help :help topic Use :q to exit help Vimtutor





   作业


1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符


                1 sed   's/^[[:space:]]+//' /etc/grub.conf 

               

1电脑演示

[root@localhost tmp]# sed 's/^[[:space:]]\+//' /etc/grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths are relative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/sda2

#          initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS 6 (2.6.32-642.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-642.el6.x86_64.img

[root@localhost tmp]# 






2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

               1 sed 's/^#[[:space:]]\+//' /etc/fstab

               2 sed -r 's/^(#|[[:space:]]+)//' /etc/fstab


1电脑演示

[root@localhost tmp]# sed 's/^#[[:space:]]\+//' /etc/fstab 


#

/etc/fstab

Created by anaconda on Tue Jul 19 20:14:32 2016

#

Accessible filesystems, by reference, are maintained under '/dev/disk'

See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 /                       ext4    defaults        1 1

UUID=a142fc0a-a404-49c7-a4a2-494c867ec71c /boot                   ext4    defaults        1 2

UUID=cd32c025-5104-4670-bab4-e5db886ed7b9 /testdir                ext4    defaults        1 2

UUID=84187402-904e-4673-81cd-3228183a2437 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/cdrom /mnt iso9660 defaults 0 0

[root@localhost tmp]# 





3、在/root/install.log每一行行首增加#号

              1  sed 's/^/#&/' /root/install.log


1电脑演示

[root@localhost tmp]# sed 's/^/#&/' /root/install.log

#{

#333

#anaconda-ks.cfg

#Desktop

#Documents

#Downloads

#f1

#f22

#f99

#f[a,b,c,d,e,f]

#history.log

#install.log

#install.log.syslog

#Music

#nusers

#Pictures

#Public

#Templates

#Videos

[root@localhost tmp]# 







4、在/etc/fstab文件中不以#开头的行的行首增加#号

1 sed 's/^[^#]/#&/' /etc/fstab

1电脑演示

[root@localhost tmp]# sed 's/^[^#]/#&/' /etc/fstab 


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 20:14:32 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

#UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 /                       ext4    defaults        1 1

#UUID=a142fc0a-a404-49c7-a4a2-494c867ec71c /boot                   ext4    defaults        1 2

#UUID=cd32c025-5104-4670-bab4-e5db886ed7b9 /testdir                ext4    defaults        1 2

#UUID=84187402-904e-4673-81cd-3228183a2437 swap                    swap    defaults        0 0

#tmpfs                   /dev/shm                tmpfs   defaults        0 0

#devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

#sysfs                   /sys                    sysfs   defaults        0 0

#proc                    /proc                   proc    defaults        0 0

#/dev/cdrom /mnt iso9660 defaults 0 0

[root@localhost tmp]# 






5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

1 echo "/etc/sysconfig/network-scripts/" | sed -r 's@(.*/)([^/]+/?)$@\1@'


2 echo "/etc/fst/sd" | sed -r  's@(.*)/([^/]+/?)@\2@'


3 echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\1@' 


3电脑演示

[root@localhost tmp]# echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\1@'

/etc/fst/

[root@localhost tmp]# echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\2@'

sd

[root@localhost tmp]# 







6、利用sed 取出ifconfig命令中本机的IPv4地址

1 ifconfig | sed '2!d' | sed  -r 's@.*inet.addr:(.*)B.*@\1@'   [! 取反]


1电脑演示

[root@localhost tmp]# ifconfig | sed '2!d' | sed  -r 's@.*inet.addr:(.*)B.*@\1@'

172.18.16.71  

[root@localhost tmp]# 





7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数


1 ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c


2 ls /run/media/root/centos |sed 's@\.rpm@@' | sed 's@.*\.@@' |sort|uniq -c


3 ls *.rpm |rev|cut -d. -f2 |rev|sort|uniq -c


1电脑演示


 [root@localhost tmp]# ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c

      4 i686

      1 /mnt/Packages/TRANS.TBL

    919 noarch

   2283 x86_64

[root@localhost tmp]#

sed 和 vim 的 用法 0人

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

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code