示例2:
通过字符串匹配出想要的行。
[root@yuji ~]# sed '/e$/d' ff.txt //删除以e结尾的行 two four six seven eight ten [root@yuji ~]# sed '/e$/!d' ff.txt //除了以e结尾的行,其他行都删除 one three five nine 复制代码
网络异常,图片无法展示
|
示例3:
'/字符串1/,/字符串2/d' :从第一个匹配的位置打开删除功能,到第二个匹配的位置删完后关闭删除功能。之后继续按这个规则向下查找删除。
[root@yuji ~]# cat 2.txt 111 222 333 444 555 111 222 333 444 555 [root@yuji ~]# sed '/2/,/4/d' 2.txt 111 555 111 555 [root@yuji ~]# sed '/1/,/3/d' 2.txt 444 555 444 555 复制代码
网络异常,图片无法展示
|
示例4:
删除空行并保存:sed -i '/^$/d' file.txt (使用-i前先备份目标文件)
[root@yuji ~]# cat file.txt 11 22 33 [root@yuji ~]# sed -i '/^$/d' file.txt [root@yuji ~]# cat file.txt 11 22 33 复制代码
网络异常,图片无法展示
|
小贴士:
删除空行的三种方法:
- grep -v "^$" file.txt //过滤出非空行
- cat file.txt |tr -s "\n" //压缩换行符
- sed '/^$/d' file.txt //删除空行
6 sed 修改替换s c y
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
6.1 替换字符串 s
格式:
行范围 s/旧字符串/新字符串/替换标记 #4种替换标记: 数字:表明新字符串将替换第几处匹配的地方 g:表面新字符串将会替换所有匹配的地方 p:打印与替换命令匹配的行,与-n一起使用 w 文件:将替换的结果写入文件中 复制代码
示例1:
[root@yuji ~]# sed -n '/root/p' pass.txt //打印所有包含root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@yuji ~]# sed -n 's/root/aaa/p' pass.txt //将匹配行的第1个root替换成aaa aaa:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/aaa:/sbin/nologin [root@yuji ~]# sed -n 's/root/aaa/2p' pass.txt //将匹配行的第2个root替换成aaa root:x:0:0:aaa:/root:/bin/bash [root@yuji ~]# sed -n 's/root/aaa/3p' pass.txt //将匹配行的第3个root替换成aaa root:x:0:0:root:/aaa:/bin/bash [root@yuji ~]# sed -n 's/root/aaa/gp' pass.txt //将匹配行的所有root替换成aaa aaa:x:0:0:aaa:/aaa:/bin/bash operator:x:11:0:operator:/aaa:/sbin/nologin 复制代码
网络异常,图片无法展示
|
示例2:
[root@yuji ~]# sed -n 's/root//gp' pass.txt //删除匹配行当所有root :x:0:0::/:/bin/bash operator:x:11:0:operator:/:/sbin/nologin [root@yuji ~]# echo 000010101 | sed 's/^0*//' //删除开头所有的0 10101 复制代码
网络异常,图片无法展示
|
示例3:
将root开头的行进行注释(在开头加上#);
在包含root的行的行尾加上#
[root@yuji ~]# sed -n '/^root/p' pass.txt //打印所有以root开头的行 root:x:0:0:root:/root:/bin/bash [root@yuji ~]# sed -n '/^root/ s/^/#/p' pass.txt //过滤出以root开头的行,在行首加上# #root:x:0:0:root:/root:/bin/bash [root@yuji ~]# sed -n '/root/p' pass.txt //打印包含root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@yuji ~]# sed -n '/root/ s/$/#/p' pass.txt //在包含root的行的行尾加上# root:x:0:0:root:/root:/bin/bash# operator:x:11:0:operator:/root:/sbin/nologin# 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
示例4:另一种替换方式
将包含root内容的行进行注释:
用正则表达式匹配包含root的整行内容,之后在整行内容前加#。&代表前面使用正则表达式匹配到的整行内容。
[root@yuji ~]# sed -n '/root/ s/^/#/p' pass.txt //过滤出包含root的行,在行首加上# #root:x:0:0:root:/root:/bin/bash #operator:x:11:0:operator:/root:/sbin/nologin [root@yuji ~]# sed -n 's/.*root.*/#&/p' pass.txt #root:x:0:0:root:/root:/bin/bash #operator:x:11:0:operator:/root:/sbin/nologin 复制代码
网络异常,图片无法展示
|
示例5:-f 指定脚本文件来执行
可以在文件中定义多条操作规则。
[root@yuji ~]# vim 1.sh [root@yuji ~]# cat 1.sh /root/ s/^/#/p 3,5 s/$/#/p [root@yuji ~]# sed -n -f 1.sh pass.txt //指定1.sh文件来执行 #root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin# adm:x:3:4:adm:/var/adm:/sbin/nologin# lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin# #operator:x:11:0:operator:/root:/sbin/nologin 复制代码
网络异常,图片无法展示
|
示例6:将修改后的内容保存到另一个文件中
1)重定向全文本(将修改后的行内容和原文其他内容一起保存)
[root@yuji ~]# cat ff.txt one two three four five six seven eight nine ten [root@yuji ~]# sed '1,5 s/^/#/' ff.txt >out1.txt //重定向全文本 [root@yuji ~]# cat out1.txt #one #two #three #four #five six seven eight nine ten 复制代码
网络异常,图片无法展示
|
2)只重定向修改的内容(两种方法)
#方法一,重定向 [root@yuji ~]# sed -n '1,5 s/^/#/p' ff.txt >out2.txt [root@yuji ~]# cat out2.txt #one #two #three #four #five #方法二,使用w [root@yuji ~]# sed -n '1,5 s/^/#/w out3.txt' ff.txt [root@yuji ~]# cat out3.txt #one #two #three #four #five 复制代码
网络异常,图片无法展示
|
示例7:指定分隔符
当字符串中包含"/"时,需要在前面加上转义符\,避免和分隔符"/"混淆。这样操作非常麻烦,且容易眼花看错,此时可以自己指定分隔符。
s后面的第一个字符就是分隔符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符需要使用 \ 转义成普通字符。
#默认分隔符为"/" [root@yuji ~]# sed -n 's//bin/bash//sbin/nologin/p' pass.txt root:x:0:0:root:/root:/sbin/nologin yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin nancy:x:1021:1021::/home/nancy:/sbin/nologin helen:x:1022:1022::/home/helen:/sbin/nologin #指定#作为分割符 [root@yuji ~]# sed -n 's#/bin/bash#/sbin/nologin#p' pass.txt root:x:0:0:root:/root:/sbin/nologin yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin nancy:x:1021:1021::/home/nancy:/sbin/nologin helen:x:1022:1022::/home/helen:/sbin/nologin #指定!作为分隔符 [root@yuji ~]# sed -n 's!/bin/bash!/sbin/nologin!p' pass.txt root:x:0:0:root:/root:/sbin/nologin yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin nancy:x:1021:1021::/home/nancy:/sbin/nologin helen:x:1022:1022::/home/helen:/sbin/nologin #指定8作为分隔符 [root@yuji ~]# sed -n 's8/bin/bash8/sbin/nologin8p' pass.txt root:x:0:0:root:/root:/sbin/nologin yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin nancy:x:1021:1021::/home/nancy:/sbin/nologin helen:x:1022:1022::/home/helen:/sbin/nologin 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
思考:
sed 's9\945\99\98\939g' test.txt //这行命令的作用是什么? 相当于s/94599/9893/g,指定了9作分隔符,那么普通的数字9前面要加\。即将94599替换成9893。 复制代码
网络异常,图片无法展示
|
6.2 整行替换 c
使用c进行替换,是对整行内容进行替换。
示例:
将包含字符串fo的行,整体替换成22。
[root@yuji ~]# cat ff.txt one two three four five six seven eight nine ten [root@yuji ~]# sed '/fo/c 22' ff.txt //将包含fo的行,整体替换成22 one two three 22 five six seven eight nine ten 复制代码
网络异常,图片无法展示
|