sed工具概述:
-
文本处理工具,读取文本内容,根据指定条件进行处理。
-
可在无交互的清空下实现相当复杂的文本处理操作
-
被广泛应用于Shell脚本,以完成自动化处理任务
-
sed依赖于正则表达式
-
工作原理:读取===>执行===>显示
一、sed命令格式
1.sed命令格式
sed -e '编辑指令'文件1 文件2
sed -f -e '编辑指令'文件1 文件2
sed -i -e '编辑指令'文件1 文件2
2.常用选项
-e 指定要执行的命令,只有一个编辑命令时可省略
-h 显示帮助
-n 仅显示script处理后的结果
3.执行多条命令格式
方式一:
sed -e '操作1' -e '操作2' 文件
方式二:
sed -e '操作1;操作2' 文件
方式三:
sed -e 'n{
操作1
操作2
......
}' 文件1
4.sed命令的操作符
s:替换,替换指定字符
d:删除,删除选定的行
a:增加,在当前行下面增加一行指定内容
i:插入,在选定行上面插入一行指定内容
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
=:打印行号
n: 跳过下一行执行
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;
如果有非打印字符,则码输出。其通常与"-n"选项一起使用。
r:一般和高级正则表达式
(1)打印(查询)操作
(i)打印指定行内容
sed -n '#p' test.sh 打印test.sh文件中第#行内容
sed -n '$p' test.sh 打印test.sh文件中最后一行内容
(ii) 指定区间内容
sed -n '2,6p' test.sh 打印2-6行内容
sed -n '6,$p' test.sh 打印第六行到最后一行内容
sed -n '6,+6p' test.sh 打印第六行以及后面6行内容
(iii) 指定间隔打印
sed -n -e '2p' -e '$p' test.sh 打印第二行和最后一行
(iv)对奇数行和偶数行的打印
sed -n 'n;p' test1.txt 打印偶数的行
sed -n 'p;n' test1.txt 打印奇数的行
这里的n就是指高级模式的意思,n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,跳过第二行,即打印奇数行 。
(v)文本模式过滤内容
方式一:对包含的字符串进行过滤打印
sed -n '/o/p' test.txt 包含o的所有行
sed -n '/th/p' test.txt 包含th的所有行
方式二: 应用基础正则表达式进行打印
sed -n '/^root/p'/etc/passwd 以root为开头的所有内容,全文本搜索
sed -n ' /bash$/p'/etc/passwd 以bash结尾的所有内容,全文本搜索
sed -n '4,/bash$/p' /etc/passwd 从第四行开始,一直打印到第一个以bash为结尾的所在行
(2)删除操作
sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)
sed -n '3d;p' test1.txt 删除第三行,打印剩余的所有内容
sed -n '5,8d;p' test1.txt 删除5到8行,打印剩余的所有内容
sed -n '5,$d;p' test1.txt 删除5到最后一行行,打印剩余的所有内容
sed '4,6!d' test1.txt 除了4-6行,其他的全部删除
(3)匹配字符串删除(查询)操作
sed '/one/d' test1.txt 删除包含one的行
sed '/one/,/six/d' test1.txt 删除包含one行到six行
sed '/one/,/six/! d' test1.txt 除了one-six的行,其余的全部删除,反向删除
sed '/six/ !d' test1.txt 除了six行,其余的全部删除,反向删除
sed '/^$/d' test1.txt 通过^$,来删除空行;
补充:删除空行的三种方法:
grep -v "^$" test1.txt 过滤出非空行
cat test1.txt ltr -s "\n" 压缩换行符
sed '/^$/d' test1.txt 删除空行
(4)替换(修改)操作
格式:
行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表示新字符串替换第几出匹配的地方
q:表示新字符串会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w文件:将替换的结果写入文件中
替换中的指令:
s:替换字符串
c:整行替换
y:字符替换,针对一个字符串进行替换,替换前后字符串要相同。
注意:-y 针对单个字符进行替换,比如用123替换aaa,替换结果是aaa被替换为111。
实例:
sed -n 's/root/test/2p' /etc/passwd 将passwd文件中的第二个root替换为test
sed -n 's/root/test/gp' /etc/passwd 将passwd文件中的root全部替换为test
sed -n 's/^root/ s/^/#/p' /etc/passwd 以root开头的行,前面加上#,即注释掉
sed '/echo/c ok' test.sh 将含echo的行,替换为ok
sed '/b=2/a insert' test.sh 在含b=2的行前插入内容为insert的一行
sed '$r test2.sh' test.sh 在test2文件内插入test文件内容
sed 'y/echo/ookk/' test.sh 把echo字符串替换为ookk字符串