• 以下用法详解基于centos8.2版本,与其他发行版可能会有差异,本文仅供参考,以实际为准。

用法: sed [选项]… {脚本(如果没有其他脚本)} [输入文件]…

参数:
-e 脚本, –expression=脚本
添加“脚本”到程序的运行列表
-f 脚本文件, –file=脚本文件
添加“脚本文件”到程序的运行列表
-n或–quiet或–silent 仅显示script处理后的结果

指令:
a 新增,在下一行新增字符串
c 替换,会替换行之间的内容
d 删除,删除行
p 打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s 替换,s指令可以搭配正则表达式使用
i 插入,把i指令当作-i参数使用会直接修改源文件内容

如果没有 -e, –expression或-f, –file 选项,那么第一个非选项参数被视为sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准输入读取数据。指令内容最好用单引号括住,防止命令读取超过预定参数的字符。

echo -e “12345\nabcde\nABCDE\n123abcABC” > ./test #在当前目录下创建名为test的测试文件
文件内容如下:

1  12345
2 abcde
3 ABCDE
4 123abcABC

-e参数用法:
sed -e ‘4a\string’ ./test #在文档第四行后添加字符串string
sed -e ‘4a\string’ -e ‘4d’ ./test #在文档第四行后添加字符串string,同时删除第四行原有内容

  • -e参数可以添加也可以不添加,执行后的结果是一样的。也可以同时添加多次,执行多次命令

[root@ecs-centos8 ~]# sed -e ‘4a\string’ ./test
12345
abcde
ABCDE
123abcABC
string
[root@ecs-centos8 ~]# sed -e ‘4a\string’ -e ‘4d’ ./test
12345
abcde
ABCDE
string

-n参数用法:
sed -n ‘/abc/p’ ./test # 查找包含字符串abc的行,并打印到控制台

  • -n参数一般与指令p合用,用于查找包含指定字符串的行,并打印到控制台

[root@ecs-centos8 ~]# sed -n ‘/abc/p’ ./test
abcde
123abcABC

a(新增)指令用法
sed ‘3a\newline’ ./test #3代表第三行,a代表新增,3a代表在第三行后面新增字符串“newline”
sed ’3a\newline \
> mangline’ ./test #新增多行内容

  • 结果会输出在控制台。除了转义符\,指令a后面的任何字符都会被当成字符串的一部分,sed ’3anewline‘ ./test 两条命令的执行结果一样,但是加入反斜杠会更容易区分指令和字符串,a指令只能在文档最后一行及之前的行新增字符串,如果参数的行数超过文档的行数,新增字符串会失败,控制台会输出文档原有内容。

[root@ecs-centos8 ~]# sed 3a\newline ./test
12345
abcde
ABCDE
newline
[root@ecs-centos8 ~]# sed 5a\newline ./test
12345
abcde
ABCDE
[root@ecs-centos8 ~]# sed ‘3anewlines\
manyline’ ./test
12345
abcde
ABCDE
newlines
manyline

c(替换)指令用法:
替换单行sed ‘1c\newline’ ./test #替换文档第一行内容
替换多行sed ‘2,3c\manyline’ ./test ,#替换文档2-3行内容

  • 替换单行或多行内容为指定的字符串无法替换文档没有的行,多行替换会把多行合并替换为一行,而不是每行都分开替换。

[root@ecs-centos8 ~]# sed ‘1c\newline’ ./test
newline
abcde
ABCDE
[root@ecs-centos8 ~]# sed ‘2,3c\manyline’ ./test
12345
manyline

d(删除)指令用法:
删除单行sed ’2d‘ ./test #删除文档第二行内容
删除多行sed ‘2,3d’ ./test #删除文档第2-3行内容

  • 因为是删除,所以d后面什么都不用加。

[root@ecs-centos8 ~]# sed ‘2d’ ./test
12345
ABCDE
[root@ecs-centos8 ~]# sed ‘2,3d’ ./test
12345

p(打印)指令用法:
打印单行sed -n ’3p’ ./test #打印文档第三行内容
打印多行sed -n ‘2,3p’ ./test #打印文档第2-3行内容

  • 指令p一般需要与参数-n一块使用,不添加-n参数会把指定行的内容重复输出一遍。

[root@ecs-centos8 ~]# sed -n ‘3p’ ./test
ABCDE
[root@ecs-centos8 ~]# sed -n ‘2,3p’ ./test
abcde
ABCDE
[root@ecs-centos8 ~]# sed ‘2,3p’ ./test
12345
abcde
abcde
ABCDE
ABCDE
123abcABC

s(替换)指令用法:
替换单行sed ‘4s/123/987/‘ ./test #替换第4行的123为987,替换单行需要指定行号
替换多行sed ‘s/123/987/‘ ./test #替换文档所有的123为987
正则表达式替换单行1次sed ‘2s/[a-z]/987/‘ ./test #替换文档第2行第一次匹配到的内容为987
正则表达式替换多行1次 sed ‘s/[a-z]/987/‘ ./test #替换文档所有行 第一次匹配到的内容为987
正则表达式替换单行多次sed ‘2s/[a-z]/987/g’ ./test #替换文档指定行所有匹配到的内容为987
正则表达式替换多行多次sed ‘s/[a-z]/987/g’ ./test #替换文档所有行所有匹配到的内容为987

  • 正则表达式中匹配多次和单次以末尾加g和不加g来区别。

[root@ecs-centos8 ~]# sed ‘4s/123/987/‘ ./test
12345
abcde
ABCDE
987abcABC
[root@ecs-centos8 ~]# sed ‘s/123/987/‘ ./test
98745
abcde
ABCDE
987abcABC
[root@ecs-centos8 ~]# sed ‘2s/[a-z]/987/‘ ./test
12345
987bcde
ABCDE
123abcABC
[root@ecs-centos8 ~]# sed ‘s/[a-z]/987/‘ ./test
12345
987bcde
ABCDE
123987bcABC
[root@ecs-centos8 ~]# sed ‘2s/[a-z]/987/g’ ./test
12345
987987987987987
ABCDE
123abcABC
[root@ecs-centos8 ~]# sed ‘s/[a-z]/987/g’ ./test
12345
987987987987987
ABCDE
123987987987ABC

i(插入)指令用法
sed ‘3i\qwery’ ./test #在第三行插入指定的字符串

  • i指令和a指令类似,i指令是直接在指定行插入内容,a指令是在指定行之后插入内容,i指令后除了反斜杠其余字符都会被当成字符串插入文档中。

[root@ecs-centos8 ~]# sed ‘3i\qwery’ ./test
12345
abcde
qwery
ABCDE
123abcABC