linux温故知新九

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开头的行号和内容

wKiom1gcMlDir-89AAAYuYTJ8Ik681.png-wh_50

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还存在保持空间,通过高级编辑命令对模式空间与保持空间的覆盖、追加、删除等操作实现了较为复杂的文本处理如:文本倒序、邮件信息处理等等


wKiom1gcOs-REbyCAAJNW3qfhdY297.png-wh_50


打开文件 

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),-短删除寄存器 


wKioL1gcO2uT8HnnAAHPLwtQv1I902.png-wh_50

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

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

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


wKiom1gcO7qju8ZrAABLglI1rFo356.png-wh_50


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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章