码迷,mamicode.com
首页 > 其他好文 > 详细

sed

时间:2020-08-25 18:30:06      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:test   ESS   多重   sed -e   多个   显示   开头   mon   读取   

sed

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

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

查找

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

例如只打印第2行

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

打印包含某个字符串的行
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

包含特殊字符用法

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

sed -n ‘/^1/‘p passwd

#打印以 in 结尾的行

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

在每一行最前面加上aaa:

sed -r ‘s/.*/aaa:&/‘ 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打印所有行。

/bin/cp /etc/passwd /root/test.txt ; 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‘ test.txt

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

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

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

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

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

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

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

sed -r ‘s/(^[a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]+$)/\3\2\1/‘ test.txt

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

sed -r ‘s/(^[^0-9])([0-9]+)([^0-9].[^a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/‘ test.txt

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

sed -r ‘s/(^[^0-9])([0-9]+)([^0-9].$)/\1\3\2/‘ test.txt

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

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

sed

标签:test   ESS   多重   sed -e   多个   显示   开头   mon   读取   

原文地址:https://blog.51cto.com/11451960/2521961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!