sed(stream edit)作为流编辑器是逐行处理的,默认将处理结果写出到屏幕(stdout),并不会修改源文件。在工作中是一个非常实用的文本编辑工具。
将文件以行为基本单位读入到内存中
使用sed指定的匹配动作对每一行进行处理
处理完成后进行输出,直到处理完最后一行结束,并不修改原文件内容
基本语法如下:
sed [选项] '[定位符]处理动作' filename
n:静默模式
f:指定sed脚本
i:直接修改源文件内容
e:指定sed动作,支持指定多个
r:启用扩展正则表达式
s:替换匹配内容
d:删除匹配内容
c:改变匹配内容
i:在匹配行前插入指定内容
a:在匹配行后追加指定内容
g:匹配全局,也可以指定数字,表示匹配第几次出现
p:打印匹配动作处理的项,可以和选项-n一起搭配使用只输出被sed处理过的行
w file:匹配处理行写入指定文件
# 先查看示例文件内容
% cat test.txt
root:*:0:0:System Administrator:/var/root:/bin/sh
# 替换文本中第一次出现的root为aboboo
% sed 's/root/aboboo/' test.txt
aboboo:*:0:0:System Administrator:/var/root:/bin/sh
# 替换文本中第二次出现的root为aboboo,如果想替换第三次或者第四次,其实写上对应的数字即可
% sed 's/root/aboboo/2' test.txt
root:*:0:0:System Administrator:/var/aboboo:/bin/sh
# 全局替换,替换行中出现的所有root为aboboo
% sed 's/root/aboboo/g' test.txt
aboboo:*:0:0:System Administrator:/var/aboboo:/bin/sh
# 先查看示例文件内容
% cat d.txt
1a
2b
3c
4d
5e
6f
# 在输出结果中删除2-4行,不修改原文件
% sed '2,4d' d.txt
1a
5e
6f
# 删除匹配a的行
% sed '/a/d' d.txt
2b
3c
4d
5e
6f
# 在输出结果中打印行号
% sed '2,4d;=' d.txt
1
1a
5
5e
6
6f
这里需要注意下,在MacOS这三个命令默认只想会报错哦。
# 先查看示例文件内容
% cat d.txt
1a
2b
3c
4d
5e
6f
% sed '/a/c change' d.txt
change
2b
3c
4d
5e
6f
% sed '/a/i change' d.txt
change
1a
2b
3c
4d
5e
6f
% sed '/a/a change' d.txt
1a
change
2b
3c
4d
5e
6f