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 保存退出 

  :x 保存退出  


命令模式 

  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

(0)
上一篇 2016-08-12 09:02
下一篇 2016-08-12 09:02

相关推荐

  • N25–第十二周作业

    1、  请描述一次完整的http请求处理过程; (1)建立和处理连接:接收请求或者拒绝请求; (2)接收请求:接收来自于网络上的主机请求报文中对某特定的资源的一次请求的过程; (3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息 (4)访问资源:获取请求报文中请求的资源 (5)构建响应报文; (6)发送响应报文; (7)记录…

    2017-03-28
  • 计算机的组成介绍

    一,什么是计算机?     计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 二,发展历史 阶段 时期(年) 主要器件 特征 应用领域发展 第一代 1946—1958 电子管数字机 电子管,机…

    2016-10-29
  • linux文件管理类命令学习总结练习

    1、常用文件管理类命令:cp, mv, rm   cp: copy命令       单元复制 cp [OPTION]… [-T] SOURCE DEST                     DEST不存在…

    Linux干货 2016-11-06
  • bash脚本编程class3

    bash脚本编程class3—函数定义与数组使用相关     一.函数的使用以及数组的定义   我们通过学习知道,当编辑一个shell脚本的时候,可以在这个shell脚本中调用其他的shell脚本来实现特定的功能。在实际工作环境中,用很多shell实现的功能是我们常常使用到的,如果一次一次的调用这些shell脚本会显得非常麻烦。…

    Linux干货 2016-08-24
  • 8.1-用户和组(作业篇)

     1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中。 [root@localhost ~]# tr a-z A-Z </etc/issue > /tmp/issue.out [root@localhost ~]#&n…

    Linux干货 2016-08-04
  • 作业:0805

    1.查出用户UID最大值的用户名、UID及shell类型 > cat /etc/passwd|cut -d: -f 1,3,7 |sort -t: -k2 -n| tail -1 2.查出/tmp的权限,以数字方式显示 > st…

    Linux干货 2016-08-08