sed

sed

做用:主要用于替换指定的字符;查找或替换指定字符串时,必须把字符串用//来注释下,好比root 必须是/root/;
sed 只要不用-i参数,通常都是在输出终端上显示而已,没法更改源文件;
express

参数-e: --expression,多重编辑;
参数-n:不带-n则列出文件全部内容,加上-n只列出匹配的那一行;
参数-i:直接修改读取的内容文件,而不是输出到终端;
参数-r:可让特殊字符不用加转义符脱义
功能I:忽略查询字符的大小写 ‘/ /’Ip
功能s:替换、取代;
功能g:本行全局替换;
功能d:删除;
功能a:新增;bash

查找

打印指定某行
sed -n 'n'p filename
引号n表明数字,第几行,p为打印意思;

例如只打印第2行ide

[root@jinkai01 sed]# sed -n '2'p passwd
bin:x:1:1:bin:/bin:/sbin/nologincode

打印包含某个字符串的行
sed -n '/root/'p filename
root 表明字符串,将包含root的行打印出来
文档

[root@jinkai01 sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin字符串

包含特殊字符用法it

#打印以1 为开头的行****io

sed -n '/^1/'p passwd class

#打印以 in 结尾的行test

sed -n '/in$/'p passwd

#打印包含r 和 o 之间有零个或一个的任意字符的行

sed -n '/r.o/'p passwd

#打印包含oo后面有零个或多个o的行

sed -n '/ooo*/'p passwd

#sed命令加上-e选项能够实现多个行为

sed -e '1'p -e '/111/'p -n passwd
打印出第一行和包含111字符的全部行

替换

替换字符或者字符串
参数s就表示替换的动做;
参数g表示本行全局替换,若是不加g则只替换本行出现的第
一个;
指定替换一行或多行内的字符,不加数字就是替换文档所有,$表示结尾,^表示开头;

实验:把passwd文档的第1行和第2行的root换成aaa且打印出来

[root@jinkai01 sed]# sed '1,2s/root/aaa/g' passwd
aaa:x:0:0:aaa:/aaa:/bin/bash

替换文档内的所有数字或字母为空

实验:把passwd 文档内的全部字母替换为空
[root@jinkai01 sed]# sed 's/[a-zA-Z]//g' passwd
::0:0::/://
::1:1::/://

替换字母大小写
sed中,使用\u表示大写,\l表示小写

  1. 把文件中每一个单词的第一个小写字母变大写:

    sed 's/\b[a-z]/\u&/g' filename

  2. 把文件中全部字母小写变大写:

    *sed 's/[a-z]/\u&/g' filename

  3. 把文件中因此字母大写变小写:

    sed 's/[A-Z]/\l&/g' filename

删除

d:删除动做。
这里参数d表示删除的动做,它不只能够删除指定的单行以及多行,并且能够删除匹配某个字符的行,还能够删除从某一行开始到文档最后一行的全部行。
这个删除操做仅仅是显示在屏幕上,原文档并无影响。

实验:删除passwd内包含root的行

[root@jinkai01 sed]# sed '/root/'d passwd

实验:删除passwd 文档的第1行

[root@jinkai01 sed]# sed '1'd passwd

实验:删除passwd 文档的第1行到第3行

[root@jinkai01 sed]# sed '1,3'd passwd

调换

调换两个字符串的位置
-r 参数:能够不用加转义符\ 去脱义特殊字符

实验:把passwd文档内的root 和bin调换位置

[root@jinkai01 sed]# sed -r 's/(root)(.*)(bin)/\3\2\1/' passwd

实验:把passwd文档内的第一列和最后一列作调换

[root@jinkai01 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon

实验:在某一行先后增长指定内容
在每一行最后面加上:aaa

sed -r 's/([^:]+$)/\1:aaa/' passwd
或sed -r 's/(.*)/\1:aaa/' passwd

在每一行最前面加上aaa:

sed -r 's/(.*)/aaa:\1/' passwd
或sed -r 's/([^:]+)/aaa:\1/' passwd

直接修改文件内容

将passwd 文档里面的ot 所有替换为 to,不打印到屏幕,真实改变文件自己

[root@jinkai01 sed]# sed -i 's/ot/to/g' passwd
[root@jinkai01 sed]# head -3 passwd
roto:x:0:0:roto:/roto:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 
 




课后习题
(1) 把/etc/passwd复制到/root/test.txt,用sed打印全部行。

sed -n '1,$'p test.txt

(2) 打印test.txt的第3行~第10行。

sed -n '3,10'p test.txt

(3) 打印test.txt中包含root的行。

sed -n '/root/'p test.txt

(4) 删除test.txt的第15行以及后面的全部行。

sed '15,$'d test.txt

(5) 删除test.txt中包含bash的行。

sed '/bash/'d test.txt

(6) 将test.txt中的root替换为toor。

sed 's/root/toor/g'p test.txt

(7) 将test.txt中的/sbin/nologin替换为/bin/login。

sed 's#sbin/nologin#bin/login#g'p test.txt

(8) 删除test.txt中第5行~第10行中全部的数字。

sed '5,10s/[0-9]//g'p test.txt

(9) 删除test.txt中全部的特殊字符(除了数字以及大小写字母)。

sed 's/[^0-9a-zA-Z]//g'p test.txt

(10) 把test.txt中第一个单词和最后一个单词调换位置。

sed -nr 's/([a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p test.txt

(11) 把test.txt中出现的第一组数字(1个或多个)和最后一个单词调换位置。

sed -nr 's/(^[^0-9])([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/g'p test.txt
或者sed -nr 's/([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p

(12) 把test.txt中第一个数字移动到本行末尾。

sed -nr 's/(^[^0-9] )([0-9]+)([^0-9].*$)/\1\3\2/'p test.txt 一组数字
或sed -nr 's/([0-9])(.)([^0-9].*$)/\3\2\1/'p 单个数字

(13) 在test.txt第20行到最后一行最前面加aaa:。

sed '20,$s/^.*$/aaa:&/'p test.txt

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息