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开头的行号和内容
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
打开文件
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【’ ” ( { [ <】
命令模式输入数字,进入插入模式输入字符,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),-短删除寄存器
命名寄存器:#”f yy表示复制#行到f寄存器中;而 “fp表示读取粘贴;扩展模式:#put f 放置f寄存器内容到第5行
数字寄存器,0存放最近复制的内容,1存放最近的删除内容。当新的文本变更和删除时,1转存到2,2到3……不同会话不能共享内容
查看寄存器内容在扩展模式 :register f #显示寄存器内容
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
练习
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/33085