9.4/9.5 sed命令
sed:文本处理工具 主要用于替换指定字符
用法:sed [-nrei] '内容' 文件名
sed中的命令
字母 | 意思 |
---|---|
p | 打印 |
d | 删除 |
s | 替换 |
g | 全局 |
I | 不区分大小写 |
-n
:只显示查找内容的行 可和p使用1
2[root@localhost test]# sed -n '/root/p' 1.txt ##显示出有字符串root的行
root:x:0:0:root:/root:/bin/bash
-r
:支持扩展正则表达式 即+ ? () {} | 不需要转义1
2[root@localhost test]# sed -nr '/o+t/p' 1.txt ##+需要转义
root:x:0:0:root:/root:/bin/bash
-e
:同时执行多个命令1
2
3[root@localhost test]# sed -e '5'p -e '/root/p' -n 1.txt ##打印出第五行和带有root的行
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-i
:修改文件内容1
2
3
4[root@localhost test]# sed -i '1,20d' 1.txt ##显示20行之后的行并删除文件1-20行
kun05:x:1390:1390::/home/kun05:/bin/bash
111:x:8889:8889::/home/111:/bin/bash
kun3:x:8890:8890::/home/kun3:/bin/bash
p打印
用法:sed -n '内容p' 文件名
1
2[root@localhost test]# sed -n '5p' 1.txt ##打印第五行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1 | [root@localhost test]# sed -n '2,4p' 1.txt ##打印第二到第四行 |
1 | [root@localhost test]# sed -n '/root/p' 1.txt ##显示出有字符串root的行 |
I不区分匹配字符的大小写
1 | [root@localhost test]# sed -n '/root/Ip' 1.txt |
d删除 实际对文件内容不影响
用法:sed '内容d' 文件名
1
2
3
4[root@localhost test]# sed '1d' 1.txt ##显示1行之后的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
1 | [root@localhost test]# sed '1,20d' 1.txt ##显示20行之后的行 |
1 | [root@localhost test]# sed '/oot/d' 1.txt ##显示不带有oot的行 |
s替换 不输人范围默认全部行
用法:sed '范围 s/word1/word2/g' 文件名
1
2
3
4
5
6[root@localhost test]# sed '1,5s/sbin/kun/g' 1.txt ##1-5行中把sbin全局替换为kun
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/kun/nologin
daemon:x:2:2:daemon:/kun:/kun/nologin
adm:x:3:4:adm:/var/adm:/kun/nologin
lp:x:4:7:lp:/var/spool/lpd:/kun/nologin
1 | [root@localhost test]# sed 's#/sbin/#123#g' 1.txt 视同# @来做替换符也是可以的 |
sed中正则用法
sed -n ‘1,$p’ 1.txt 打印出所有行
1 | [root@localhost test]# sed -n '1,$p' 1.txt |
sed -n ‘/^1/p’ 1.txt 打印开头是1的行
1 | [root@localhost test]# sed -n '/^1/p' 1.txt |
sed -n ‘/lt$/p’ 1.txt 打印结尾是lt的行
1 | [root@localhost test]# sed -n '/lt$/p' 1.txt |
sed -n ‘/r..o/p’ 1.txt 打印出ro间有两个任意字符的行
1 | [root@localhost test]# sed -n '/r..o/p' 1.txt |
sed -n ‘/oo*/p’ 1.txt 打印带o oo … 的行
1 | [root@localhost test]# sed -n '/oo*/p' 1.txt |
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/‘ 1.txt 把第一段和最后一段换位置
1 | [root@localhost test]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 1.txt ##([^:]+)表示非:的1或者多个字符 \数字表示前括号的序号 |
sed ‘s/[a-zA-Z]//g’ 1.txt 把字母替换成空 即删除字母
1 | [root@localhost test]# sed 's/[a-zA-Z]//g' 1.txt |
sed ‘s/[0-9]//g’ 1.txt 把数字替换成空 即删除数字
1 | [root@localhost test]# sed 's/[0-9]//g' 1.txt |
sed -r ‘s/(.*)/kun.&/g’ 1.txt 把所有行前面加上kun.
1 | [root@localhost test]# sed -r 's/(.*)/kun.&/g' 1.txt ##&表示前面的括号 |
sed -ri ‘/----autoupdate/{s/(\/\*|\*\/)//g}’ a.txt 把a.txt有----autoupdate的行 并把/*或*/去掉
注意:-i后面必须是修改的内容 不能是其他参数 匹配后执行后面花括号中的一组命令,每个命令之间用分号分隔
1 | 修改前 |
a 在匹配行后面添加
1 | $ sed '6a good!' file.txt # 在第六行后添加good! |
i 在匹配行前面添加
1 | $ sed 'i good!' file.txt # 在每行前面添加good! |
c 替换在匹配行
1 | $ sed '/^f$/c good!' file.txt # 把单词f行替换为good! |
r 读取文件内容到指定行后面
1 | $ sed '$r test.ini' file.txt # 读取test.ini内容并添加到file.txt文件最后 |
w 把匹配的行写入指定文件(覆盖原内容,马上生效,不用指定-i)
1 | $ sed '1,$w test.ini' file.txt # 把file.txt所有行写入test.ini中 |
q 搜索关键字退出程序
1 | $ tail -f logfile |sed /'success'/q # 读取logfile 文件,搜索关键字success再退出程序 |
sed命令调用外部变量
1)sed命令使用双引号情况,使用
$var
直接调用
1 | $ a=3 |
2)sed命令使用单引号情况,使用
'"$var"'
应用,单引号+双引号+变量+双引号+单引号
格式
1 | $ a=3 |