一、文本处理工具sed
sed [option]….'script] [input-file]…
简介: sed是一种流编辑器,他一次处理一行的内容,处理时把当前处理的行存储在临时缓冲区中,这个缓冲区被称为模式空间,接着用sed命令处理,处理完成后把模式空间的内容送往屏幕,接着处理下一行,知道文件末尾,而文件的内容并没有改变。模式空间相当于sed的加工厂,除此以外,还有保持空间,用于临时存储数据。
sed的工作原理图
sed是按行编辑文本的,每次从文本中取出一行,放置到自己的模式空间里进行处理,sed对文本的内容会有匹配到的行和匹配不到的行两种情况,sed对匹配到行进行处理然后输出到屏幕上,而匹配不到的行不会进行处理,同时也会输出到屏幕上。
地址定界编辑命令
常用选项:
-n:不输出模式空间的内容至屏幕
-e:script,--expression=script:多点编辑
-f: /PATH/TO/SED_SCRIPT_FILE
每行一个编辑命令``````
-r,--regexp-extended:支持使用扩展正则表达式;
-i [SUFFIX],--in-place[=SUFFIX]:直接编辑原文件;
地址定界
(1)空地址:对全文进行处理;
(2)单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3)地址范围
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/,
(4)步进:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除模式空间的内容
p:显示模式空间的内容
a \text:在行后面追加文本"text",支持使用\n实现多行追加;
i \text:在行前面插入文本text,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本"text";
w /PATH/TO/SOMEFILE:保存模式空间匹配到的至指定的文件中;
sed -n '/^[^#]/w /tmp/fstab.new' /etc/fstab
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到行的后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反
格式:地址定界!编辑命令;
s///:查找替换,其分隔符可自行执行,常用的有s@@@,s###等;
替换标记:
g:全局替换;
w/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
例题演示:
1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
[root@localhost ~]# sed -r 's@^[[:space:]]+@@g' /etc/grub2.cfg
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@localhost ~]# sed -r 's@^#[[:space:]]+@@g' /etc/fstab
#
/etc/fstab
Created by anaconda on Tue Aug 9 15:54:42 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=e19b9af8-c954-40b3-a7bb-e13de38e741a / xfs defaults0 0
UUID=48da361a-392b-4f45-a126-4b51db7c407e /boot xfs defaults0 0
UUID=587df6c7-785b-4318-9aec-cc0c6a203dc9 /usrxfs defaults0 0
UUID=a3b743bf-9613-42bb-9728-7c73a1fdf752 swapswapdefaults0 0
[root@localhost ~]#
3、在/root/install.log每一行行首增加#号
[root@localhost ~]# sed 's@^@#@g' /etc/fstab
#
##
## /etc/fstab
## Created by anaconda on Tue Aug 9 15:54:42 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=e19b9af8-c954-40b3-a7bb-e13de38e741a / xfs defaults0 0
#UUID=48da361a-392b-4f45-a126-4b51db7c407e /boot xfs defaults0 0
#UUID=587df6c7-785b-4318-9aec-cc0c6a203dc9 /usrxfs defaults0 0
#UUID=a3b743bf-9613-42bb-9728-7c73a1fdf752 swapswapdefaults0 0
[root@localhost ~]#
4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@localhost ~]# sed -r 's@^[^#]@#@g' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Aug 9 15:54:42 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
#
#UID=e19b9af8-c954-40b3-a7bb-e13de38e741a / xfs defaults0 0
#UID=48da361a-392b-4f45-a126-4b51db7c407e /boot xfs defaults0 0
#UID=587df6c7-785b-4318-9aec-cc0c6a203dc9 /usrxfs defaults0 0
#UID=a3b743bf-9613-42bb-9728-7c73a1fdf752 swapswapdefaults0 0
[root@localhost ~]#
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
[root@localhost ~]# echo "/etc/fstab" | sed -r 's@[^/]+/?$@@'
/etc/
[root@localhost ~]#
[root@localhost ~]# echo "/etc/fstab" | sed -r 's@^/[^/]+/?@@'
fstab
[root@localhost ~]#
6、利用sed取出ifconfig命令中本机的ipv4地址
[root@localhost ~]# ifconfig | sed -n '2p'| sed 's@^.*inet@@'|sed 's@netmask.*@@'
10.1.249.85
[root@localhost ~]#
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数。
[root@localhost Packages]# ls *.rpm|sed -r 's@.*\.(.*)\.rpm$@\1@'|sort|uniq -c
4 i686
919 noarch
2283 x86_64
[root@localhost Packages]#
sed命令的高级用法
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
二、vim编辑器
vim:模式化的编辑器
基本模式:
编辑模式,命令模式
输入模式
扩展命令行模式:
内置的命令行接口:
打开文件:
语法: #vim [options][file..]
+#:打开文件后,直接让光标处于第#行的行首;
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首;
模式转换:
编辑模式:默认模式
编辑模式---->输出模式:
i:insert,在光标所在处输入;
a:append,在光标所在后方输入
o:在光标所在处的下方打开一个新行;
I:在光标所在行的行首输入;
A:在光标所在行的行尾输入;
O:在光标所在处的上方打开一个新行;
输入模式------>编辑模式
ESC
编辑模式----->扩展命令行模式
:
扩展命令行模式---->编辑模式
ESC
关闭文件:
ZZ 保存并退出
:q 退出
:q! 强制退出,不保存此前的编辑操作
wq 保存并退出
:w :q
:x 保存并退出;
:w /PATH/TO/SOMEFIL
光标跳转: 字符间跳转 h:左 j:下 k:上 l:右 #COMMAND:跳转由#指定的个数的字符; 单词间跳转 w:下一个单词的刺手; e:当前或后一个单词的词尾 b:当前或前一个单词的词首行首行尾跳转 ^:跳转至行首的第一个非空白字符 0:跳转至行首; $:跳转至行尾
行间跳转 #G:跳转至由#指定的行; 1G,gg:第一行; G:最后一行
句间跳转:
)
(
段间跳转
}
{
翻屏:
ctrl+f:向文件尾翻一屏
ctrl+b:向文件首部翻一屏
ctrl+d:向文件尾部翻半屏
ctrl+u:向文件首部翻半屏
Enter:按行向后翻
vim编辑命令:
字符编辑:
x:删除光标所在处的字符;
#x:删除光标所在处起始的#个字符;
xp:交换光标所在处的字符与其后面的字符的位置;
替换命令
r:替换光标所在处的字符
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除;
dd:删除光标所在处的行;
#dd:删除表表所处的行起始的共#行;
粘贴命令(p,put,paste):
p:缓冲区中的内容如果为郑航,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后方;
复制命令(yank,y):
y:复制,工作行为相似于d命令;
yy:复制一整行
#yy:复制#行
改变命令(change,c)
编辑模式----->输入模式,实现删除操作
cc:删除光标所在的行,并转换为输出模式;
vim扩展命令模式:
内建的命令行借口
(1)地址定界
:start_pos[,end_pos]
#:特定的第#行,例如5即第5行;
#,#:指定行范围,左侧为起始行,右侧为结束行;
#,+#:指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量; 例如:3,+7
%:全文
/pattern/:从光标所在处起始向文件尾部第一次被模式所匹配到的行;
/pat1/,/pat2/:从光标所在处起始,第一次由pat1匹配到行行开始,至第一次由pat2匹配到的行结束之间的所有行;
可同编辑命令一同使用,实现编辑操作
d:删除
y:复制
c:更改
w /PATH/TO/SOMEFILE:将范围内的文本保存至指定的文件中;
r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置
(2)查找
/PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串;
?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串;
n:下一个,与命令方向相同
N:上一个,与命令方向相反
(3)查找并替换
s:扩展命令行的模式;使用格式;
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用正则表达式
替换为的内容:不能使用正则表达式,但可以引用;
如果“要查找的内容”部分在模式中使用分组符号:在"替换为的内容"中使用后向引用;
l:忽略大小写;
g:全局替换,意味着一行中如果匹配到多次,则均替换;
可把分隔符替换为其他非常用字符
s@@@
s###
VIM的多文件功能:
多文件:
vim FILE1 FILE2...
在文件间切换:
:next 下一个
:prev 上一个
:first 第一个
:last 最后一个
退出所有文件:
:wqall 保存所有文件并退出
:wall 保存所有文件
:qall 退出所有文件
多窗口:
-o:水平分割窗口
-O:垂直分割窗口
在窗口间切换:ctrl+w,ARROW
注意:单个文件也可以分割为多个窗口进行查看:
ctrl+w:水平分割窗口
ctrl+w,v:垂直分割窗口
定制vim的工作特性:
注意:在扩展命令行模式下的设定,仅对当前vim进程有效;
永久有效:
全局:/etc/vimrc
用户个人:~/.vimrc
1、行号
显示:set number,简写为set nu
取消显示:set nonumber,set nonu
2、括号匹配高亮
匹配:set showmatch,set sm
取消:set nosm
3、自动缩进
启用:set al
禁用:set noal
4、高亮搜索
启用:set hlsearch
禁用:set nohlsearch
5、语法高亮
启用:syntax on
禁用:syntax off
6、忽略字符大小写
启用:set lc
禁用:set nolc
获取帮助:
:help
:help subject
作业:
1、如何设置tab缩进为4个字符?
在.vimrc下设置:
set tabstop=4
2、复制/etc/rc.d/init.d/functions文件至/tmp目录;替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
3、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号;
原创文章,作者:因为有你,如若转载,请注明出处:http://www.178linux.com/32868