sed 高级编辑命令、模式空间、保持空间、vi 可视化模式、vimrc、地址定界

sed 高级编辑命令、模式空间、保持空间、vi 可视化模式、vimrc、地址定界

sed(stream deitor):行编辑器

【概述】sed是一种流式编辑器,它一次处理一行内容。处理时,把当前处理的行的所有内容存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,逐行处理,不修改文件。sed主要用于处理多个文件,简化对文件的反复操作,编写转换程序等。
  • 用法:sed 【option】… ‘script’ file…

  • 【option】

    • -n:关闭模式空间内容的自动输出,默认输出全文包括修改的行,注意使用场合,如除了p命令外,需要显示除了被匹配的模式外的内容时不用

    • -e:多点编辑,合并处理

    • -f /Path/file:从指定文件中读取脚本,调用脚本,不用加引号

    • -r:支持扩展的正则表达式

    • -i:原处编辑,修改文件 sed -i.bak ‘3a\sss’ file #创建备份

  • 【script】

    • 地址定界:# #,# +# /pat1/,/pat2/ /^$/匹配多行的空行

    • ~步进:1~2奇数行 2~2偶数行

  • 【编辑命令】

    • p: 显示模式空间中被修改的行

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

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

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

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

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

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

    • = 为模式空间中的行的下方打印行号

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

  • 【查找与替换】

    • s/ / /:可用@、#代替 / 号

    • s/pattern/&new&/p:在查找内容追加,&代表pattern

    • g:行内全局替换

    • p:显示替换成功的行

    • w /Path/to/where:替换成功的行保存至文件中

  • 【命令操作】

    • sed -n ‘2,+2p’ file #2到4行的内容

    • sed -n ‘/abc/p’ file #包含abc的行

    • sed -n ‘2,/abc/p’ file #2到被模式匹配的行

    • sed ‘2i\s\nss’ file #2行后面插入多行

    • sed ‘2a\s\nss’ file #2行后面追加多行

    • sed ‘2c\word’ file #改变2行内容

    • sed -n ‘/abc/=’ file #显示abc所在的行号,无内容

    • sed -n -e ‘/^abc/p’ -e ‘/^abc/=’ #显示abc开头的行号和内容

1.jpeg

    • sed -n ‘/^$/=’ file #显示空行行号

    • sed -n -e ‘/^$/p’ -e ‘/^$/=’ file #在空行下方行号

    • sed ‘/^$/d’ file #去除空行

    • sed ‘s/oldword/replace/g’ file #替换每一行中需要替换的内容

    • sed -n ‘s/root/&superman/p’ /etc/passwd #单词后追加,显示被修改的行

    • sed -n‘s/root/superman&/p’ /etc/passwd #单词前追加

    • sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets #显示全文包括修改的行

    • sed -i.bak ‘s/dog/cat/g’ pets #创建备份文件,并修改文件内容

  • 【高级编辑命令】

    • sed -n ‘n;p’ file #把模式空间中的内容覆盖至保持空间中

    • sed ‘1!G;h;$!d’ file #除了第一行都覆盖模式空间;覆盖到保持空间;删除模式空间行:倒序

    • sed ‘$!N;$!D’ file #读两行;删除多行模式空间:最后两行

    • sed ‘G’ file #追加单行模式空间:增加空行

    • sed ‘g’ file #覆盖模式空间:替换空行

    • sed ‘/^$/d;G’ file #删除空行;追加模式空间:两空行

    • sed ‘n;d’ file #读取下一行并覆盖;删除模式空间行(无-n显示模式空间d删除模式空间行就跳过了一行):显示奇数行

    • sed -n ‘1!G;h:$p’ #除了第一行都覆盖模式空间;覆盖保持空间;显示修改过程

【总结】:sed是流式的编辑器,每次读取一行到模式空间再处理,因此不会对原文件操作。当模式空间的行被修改过可用p进行指定,-n关闭模式空间的自动打印,这样就实现了特定的匹配;无-n与p就实现了模式空间内容全部打印,如使用d删除某匹配的行再打印。除了模式空间sed还存在保持空间,通过高级编辑命令对模式空间与保持空间的覆盖、追加、删除等操作实现了较为复杂的文本处理如:文本倒序、邮件信息处理等等

vi(visual interface)编辑器

  • .swap文件 

    • vi打开一个文件时会产生一个同名的.swap文件,时刻记录用户操作,正常退出则会删除.swap文件。如果非正常退出则下次打开此文件时以readonly打开并出现上图提示。可通过删除swap文件或者在/etc/vimrc文件添加 set noswapfile 

    • 2.jpeg

  • 打开文件 

    • vi +# file #定位

    • vi + file #最后一行

    • vi +/pattern file #定位到第一个模式所在行

    • vi -b hexfile #hex文件

    • vi -d file1 file2 #比较打开多个文件,高亮显示不同处

    • vi -m file #只读方式打开

    • gf #打开光标处文件名的文件,如main.c

    • ctrl ^ #切换到上次打开的文件。等于 :first

三种模式及转换

  • 命令模式(command mode)(默认):主要是查看文件内容,控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到external mode

    • ctrl s | ctrl q #锁定了,无反应,q解锁

    • shift ~ #小写变大写,小写变大写

    • shift # #高亮向上找当前光标相同的单词

    • shift * #高亮向下找相同单词,noh取消高亮

    • shift zz #(ZZ)保存并退出,ZQ不保存退出

    • 翻页(屏幕):ctrl d(下半) ctrl u(上半) ctrl f(下一屏) ctrl b(上一屏) PgUP

    • 翻页(光标):zt(光标行滚动到第一行) zz(光标行滚中间) zb(光标行滚底- 端) #zt(第#行滚到第一行) #zz #zb

    • 单词跳转:w下首 e下尾 b当前、上首

    • 光标移动:arrow j、k、h、l

    • 光标定位(行内):0 ^ $

    • 光标定位(配对):% #跳转到匹配的) ] }

    • 光标定位(行内字符):f_(定位到本行第一个) F(往前定位到_)

    • 光标定位(全文):#G(第#行) gg(第1行) G(末行) H\M\L(当前屏的第一行个、中间、最后一行的第一个位置)

    • 光标定位(句子):shift( #上一句 shift ) #下一句

    • 光标定位(屏幕行):g(arrow j k ^ $) #当句子太长时,屏幕行非常方便

    • 光标定位(段落):shift } #下一段 shift } #下一段

    • 光标定位(函数): [[ #上一个函数 ]] #下一个函数

    • 光标书签设置及跳转:m a-z #设置光标书签,用26个字母表示 ` a-z 跳转到书签

    • 增加缩进:可配合可视化选择 >增加缩进 <减少缩进

    • 删除命令:d(^ $ 0 w e b ( { ) } gg 1G G)解释一下(行第一个可见字符、行尾、行首、下一个单词首、下一个单词尾、当前或上一个单词首、上一句、上一段、下一句、下一段、文首、文末) dd(删除当前行) D(删除之行尾)=d$

    • 剪切命令:x(单个字符) #x(光标开始#个字符) xp(交换当前x内容到下一个字符之后)

    • 删除、剪切、改变命令,存放在数字1寄存器中

    • 替换字符:R(整行) r(单个字符)

    • 复制命令:y(^ $ 0 w e b ( { ) } gg 1G G)

    • 粘贴命令:p光标之后 P光标之前(粘贴单词时用P从行首复制,单词完整)

    • 配对的符号操作:先进入该配对符号中再执行以下命令

    • 更改内容:ci【’ ” ( { [ <】

    • 删除内容:di【’ ” ( { [ <】

    • 复制内容:yi【’ ” ( { [ <】

    • 选中内容:vi【’ ” ( { [ <】

3.jpeg

    • 命令模式输入数字,进入插入模式输入字符,ESC…… #重复n次输入

    • # y|d|gU|gu #如0y$ 表示从本行开头到末尾的复制,gU变大写,gu变小写

    • u撤销 ctrl r重做 #u撤销#次

    • U撤销光标落在这行后所有对此行的更改

  • 插入模式(insert mode):vi被运行时,通常处在命令模式下,键入以下命令可以使vi退出命令模式,进入插入模式(命令模式 ——> 插入模式):

    • I(i)行首与当前位置、A(a)行尾与当前位置、O(o)上行与下行

    • S #删除一行并进入insert模式

    • s #删除当前光标字母进入insert模式

    • 数字 s (arrow h、j、k、l)删除光标之后的#个字母

    • cc #删除一行并进入insert模式

    • 改变字符:c($ ^ 0 c w e b ( { ) } gg 1G G) 数字 c(arrow 、h、j、k、l) #删除并进入插入模式

  • 扩展模式(external command):ex file 或 vi -e 直接进入ex模式。可将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……不过一般我们在使用时把vi简化成两个模式,就是将扩展模式(external mode)也算入命令行模式(command mode)

    • :wq : x ZZ

    • :r file

    • :w filename #另存为

    • !command #执行命令

    • r!command #读入命令的结果

    • :# #第几行

    • 【地址定界】

    • start_pos,end_pos

    • 使用方式:后跟一个编辑命令d、y、w newfile(可 >> 追加至文件)、r file

    • # #具体行

    • #,+# #从前面的#行再加#行的范围

    • . #当前行

    • % #全文,相当于 1,$

    • /pattern/,/pattern/ #模式匹配,从第一次被匹配到的行到pattern2被匹配的行

    • #,/pattern/ #模式匹配,从#行到pattern被匹配到的行

    • /pattern/,$ #从/pattern/到文末的行

    • 【查找】

    • /pattern #向下查找 n N

    • /?pattern #向上查找 N n

    • 【查找并替换】

    • s/find/replace/修饰符

    • i:忽略大小写

    • g:全局替换,默认是替换每行第一次出现的

    • gc:全局替换,加提示

    • @、#代替分割符/ ,避免多次使用转义

  • vim的寄存器

    • a-z,A-Z寄存器,0-9数字寄存器,”未命名寄存器(不指定时默认的register),-短删除寄存器 

    4.jpeg

    • 命名寄存器:#”f yy表示复制#行到f寄存器中;而 “fp表示读取粘贴;扩展模式:#put f 放置f寄存器内容到第5行

    • 数字寄存器,0存放最近复制的内容,1存放最近的删除内容。当新的文本变更和删除时,1转存到2,2到3……不同会话不能共享内容

    • 查看寄存器内容在扩展模式 :register f #显示寄存器内容 

    5.jpeg

  • vim编辑二进制文件

    • vim -b binfile #打开二进制文件

    • 在扩展命令模式下,利用 :%!xxd 转换打开的2进制文件为16进制可读文件,修改之后 :%!xxd -r返回再退出

  • 可视化模式

    • v #字符可视化模式(characterwise visual mode),选择的单位是字符

    • gv #选中上次可视化模式时选择的文本

    • V #行可视化模式(Linewise visual mode),选择的单位是行

    • Ctrl V #块可视化模式(Blockwise visual mode),选择单位是块

    • 切换可视化模式:在命令模式下v或V或ctrl v进入可视化模式,在v可视化模式ctrl v- 进入块可视化,Esc等待1秒退出

    • 在可视化模式下编辑:在可视化模式下可完成删除、复制、~大小写转换、>增加缩进、J合并为一行、w newfile另存为、sort排序

  • vim 多个窗口

    • vim file1 file2 file3多文件模式

    • :next :prev :first :last ctrl ^

    • :wall :qall :wqall

  • 多个文件分割

    • vim -(O)o file1 file2……

    • ctrl w + arrow

  • 单个文件分割

    • ctrl w+s #水平分割多次

    • ctrl w+v #垂直分割多次

    • ctrl w+q #取消相邻的,ctrl w+o取消其他所有的

  • vim配置文件

    • 个人:~/.vimrc #默认不存在的配置文件,打开vim时自动加载

    • 全局:/etc/vimrc

    • 设置vim的工作特性

    • 行号:set【nu(number),nonu】

    • 括号匹配:set【sm(showmatch),nosm】

    • 自动缩进:set【ai,noai】

    • 高亮搜索:set【hlsearch,nohlsearch】,取消也可以noh

    • 语法高亮:【syntax on,syntax off】

    • 忽略大小写:set【ic,noic】

    • 文件格式:【fileformat=nuix,fileformat=dos】

    • 文本宽度:set【textwidth=65,wrapmargin=15】

    • 自动缩进宽度:set【shiftwidth=4】

    • 拼写检查:set 【spell,nospell】

    • :h(help)

    • :set (set all) #全部set topic

    • :h topic

    • vimtutor #tutor

练习

8.9练习.jpg

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