行编辑器sed与vim文本处理器
一.行编辑器sed的使用介绍
sed英文全称stream editor,行编辑器。其工作模式为将文件中内容按行转移至sed模拟空间中,根据地址判定此行是否匹配,如果匹配,根据命令输出并打印,如果不匹配,按照默认打印到屏幕上。它的作用是根据选项和地址界定‘script’命令实现对符合相关筛选条件的行更改显示。其用法为:sed [option]... 'script' file 。
1.选项
-n:只显示匹配到的行,不匹配的行统统不显示
-e:多点编辑
-f 文件绝对路径:从指定路径文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:在原文件中编辑
只有选项无法匹配所需要的固定行,这里需要搭配地址命令‘script’选取固定范围来使用。
2.地址
地址范围的选定有时会根据正则表达式的形式匹配,常见的地址范围规定有如下:
a.单地址
#(数字):代表所匹配的固定行
/pattern/:pattern匹配的符合条件的每一行
b.无地址:对全局进行处理
c.地址范围
#1,#2:从#1行到#2行
#1,+#2:从#1开始,一直到#1+#2之间的所有行
/part1/,/part2/:从符合part1的第一行到符合part2的第一行的中间所有行
#,/part/:从第#行到符合part条件的第一行中间的所有行
d.步进表示
~:1~2代表奇数行
2~2代表偶数行 (#1~#2说白了就是选取从#1开始每隔#2-1行的所有行)
3.编辑命令
d:删除匹配行
p:显示模式空间的内容
i /test:在行前面插入test文本内容,支持使用\n进行多行插入
a /test:在行后面插入test文本内容,支持使用\n进行多行插入
c /test:替换行为test文本,也支持使用多行替换
w /path/to/somefile:保存匹配的行内容至指定文件中
r /path/to/somefile:读取指定文件内容至模式空间中匹配到的行的行后
=:将模式空间行的行数打印出来
!:模式空间匹配的行进行取反处理
基本使用方式如下所例:
1.显示文件f2中以user[0-9]命名的用户
[root@localhost testdir]# cat f2 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...
[root@localhost testdir]# sed -n '/user[0-9]/p' f2 48 user1:x:1100:1102:dafeige:/home:/bin/bash 49 user2:x:1101:1101:dafeige:/home:/bin/bash
2.使用管道连接并在f2文件的第46行上,下加入“wohenshuai”的文本内容。第三个命令是将第46行内容替换成“wohenshuai”
[root@localhost testdir]# sed -n '46p' f2|sed 'a wohenshuai' 46 harry:x:1004:1005::/home/harry:/bin/bash wohenshuai [root@localhost testdir]# sed -n '46p' f2|sed 'i wohenshuai' wohenshuai 46 harry:x:1004:1005::/home/harry:/bin/bash [root@localhost testdir]# sed -n '46p' f2|sed 'c wohenshuai' wohenshuai
3.取反的使用示例,这里使用!将包含非‘echo’的行显示打印
[root@localhost testdir]# cat f1 #!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX [root@localhost testdir]# sed -n '/echo/!p' f1 #!/bin/bash mktemp /temp/test.XXXX
4.多点操作-e的使用:在xiaojiji文件选取含有root或两位数的行,显示打印
[root@localhost testdir]# sed -n -e '/\<[[:digit:]][[:digit:]]\>/p' -e '/root/p' xiaojiji root:x:0:0:root:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
4.行编辑内容的查找替换(比较常用)
‘s///’或‘s@@@’或‘s###’前两个//或@@或##之间为查询的匹配内容,后两个符号之间为替换内容,如果想要在原内容上追加内容,可以使用&表示查找的原内容。举例说明:
将文件f1中所有以#打头的行前面加上一个$符号:
[root@localhost testdir]# cat f1 #!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX [root@localhost testdir]# sed 's/^#/$&/' f1 $#!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX
其中地址可以使用's@^#@$&@'或's#^\##$&#'来代替。
sed存在高级模式为h,H,G,g,x,n,D,d等,涉及到模式空间下的保持空间内容,这里不做叙述,相关内容在pdf文件中。
二.vim编辑器的强大功能
与nano文本编辑不同,vim作为vi的强化版文本编辑器,有着强大但众多的编辑功能,使用便利但由于编辑方式众多,不如nano简洁,所以对于初学者无法短期内熟练掌握其所有编辑方式。其操作模式分为命令模式、编辑模式、扩展命令模式三大种。其模式的转换由键盘上的固定字符执行:Esc、:、i、v。其转换关系如下图:
1.vim打开文件的方式
vim编辑器可以使用‘+’选项指定一些特定的方式进入文本模式:
vim [option]... File...
[option]:
+#:进入文本让光标停留在第#行行首
+/pattern:进入文本让光标停留在第一个匹配到pattern行的行首
+:进入文本光标停留在最后一行行首
-d file1 file2:对比file1与file2两个文件内容
-m:只读打开文件
-e:直接进入扩展命令模式
vim编辑器支持打开多个文件,vim file1 file2 file3....。并按照从左到右顺序打开,切换到扩展命令模式‘:’输入特定内容可实现文件内容的切换操作,如下所示:
:next 显示下一个文件内容
:prev 显示上一个文件内容
:first 显示第一个文件内容
:last 显示最后一个文件内容
:wall 保存所有内容
:qall 退出所有文件
:wqall 保存并退出所有文件
2.命令模式下常用的编辑命令
当不加入选项进入vim编辑模式时,光标默认停留在首行行首上。这时键盘上的字母并不能编辑内容,而分别带有特殊意义。比如h,j,k,l代表控制光标的上下左右移动,效果等同于方向键。这里选取比较常见并且方便的由命令模式编辑文件的特殊字符:
删除命令d:
d$/D:删除当前行行标至行尾所有内容
dd:删除行标所在当前行
d0:删除当前行行首至行标所有内容
d^:删除当前行非空格行首至行标内容
dw,de,db:删除当前光标单词的操作。db表示删除行标所在处单词的词首至光标的字符,dw,de表示删除光标至词尾的字符
复制命令y:
y$:复制光标至行尾内容
y0:复制行首至光标内容
y^:复制非空格行首至光标内容
Y/yy:复制当前行
粘贴命令p:
p:粘贴至当前行标下方
P:粘贴至当前行标上方
命令模式中粘贴多次字符的方式:100[i]mcgee[Esc] 其中[]内代表操作字符,[i]切换至编辑模式输入需要重复粘贴的字符,100为粘贴次数,mcgee为粘贴的字符,[Esc]键返回命令模式并执行重复粘贴操作。
改变命令c:
c:修改后切换至编辑模式
cc:删除当前行并切换至编辑模式
C/c$:删除行标至当前行尾内容并切换至编辑模式
c0:删除行首至行标内容并切换至编辑模式
c^:删除非空格行首至行标的内容并切换至编辑模式
个人常用快速跳转光标操作(必须在命令模式下):G(跳转至文本最后行)、gg(跳转至文本首行)、0(跳转至当前行行首)、^(跳转至当前行非空格行首)、$(跳转至当前行行尾)、ctrl+左右(单词跳转)。
恢复操作u:
u:恢复之前内容。(这个功能非常重要,如果发生误操作更改,使用u即可恢复之前一次操作的文本内容了)
U:撤销当前光标所在行的所有更改
2.扩展模式的常用操作
‘:’代表切换至扩展模式,比如:q,:w,:wq!等代表保存文件以及退出与强制退出等。其实扩展命令模式看来有点像输入命令,Enter键入后执行对文本内容的操作,所以可以根据正则表达式的索引范围对特定字符的匹配行进行查找,找到后可执行修改操作。比如:
:s///(@@@)(###)就与sed命令中的s///查找更改的作用一样。举例如下:
文件f1内容如下:
#!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX ~
找寻文件中的bash,并将bash替换成csh
:s/bash/csh/g
于是文件f1内容变为如下:
#!/bin/csh echo "mike a temp file" echo mktemp /temp/test.XXXX
默认情况下只匹配每行的第一个匹配字符,其中g代表匹配全局,还有i,代表忽略大小写字符匹配
在扩展模式中经常使用查找匹配的相关功能,下面介绍一些扩展模式地址匹配的界定符号:
#(数字):指定#行
#1,#2:指定#1至#2之间行 比如2,5 指2-5行
#1,+#2:指定从#1至#1+#2之间行 比如2,+3 指2-5行
.:代表当前行
$:代表最后一行,$-1代表倒数第二行,以此类推$-n...代表倒数第n-1行
%:代表全局,整个文本
/pat1/,/pat2/:第一个匹配/pat1/的行至第一个匹配/pat2/的行
/pat/支持使用正则表达式,可以与上述符号使用,如/path/,$代表匹配pat的第一行至最后一行
这些地址界定在扩展模式的使用需要遵循固定格式,要在前面使用,后面跟上输出命令,比如:
比如f2文件内容部分如下:
33 saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 34 libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 35 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 36 gdm:x:42:42::/var/lib/gdm:/sbin/nologin 37 gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin 38 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin 39 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 40 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 41 ntp:x:38:38::/etc/ntp:/sbin/nologin
前面是个人使用echo重定向输入的行号,便于观察者理解。现在使用扩展模式删除36-39行的所有字母字符,如下操作:
:36,39s/[[:alpha:]]*//g
于是文本内容变为:
33 saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 34 libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 35 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 36 ::42:42::///:// 37 --::989:984:://--/:// 38 ::70:70: /- :///-:// 39 ::74:74:- :///:// 40 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 41 ntp:x:38:38::/etc/ntp:/sbin/nologin 42 tcpdump:x:72:72::/:/sbin/nologin
3.可视化模式VISUAL
命令模式下v键切换至visual模式,结合d,y,p等命令,可以对选定的块进行操作,举例说明:
v键进入可视化模式,还是使用f2文件:
~ ~ -- VISUAL --
光标选定块如图:
按d删除,如下:
这里需要注意的是光标停留位置很重要,以这个位置为分隔符,可以向前或者后面内容进行移动,达到随意选取的功能。
转载于:https://blog.51cto.com/11852056/1836215