sed 命令使用

1 简介

sedStream Editor 的缩写,即“流编辑器”。

sed 是一种非交互式的文本处理工具,用于对文本文件或标准输入(如管道)进行快速的过滤和转换操作。它在处理文本数据时可以逐行读取并应用编辑命令,无需人工干预,非常适合用于自动化批处理任务。

2 命令格式

sed [options] [script] file
  • options:用于控制 sed 的行为,如 -i、-n 等。
  • script:sed 执行的操作脚本,如替换、删除、插入等。
  • file:要处理的文件。

3 参数

参数参数说明
-e允许多条 sed 命令一起执行。
-i[SUFFIX]直接修改文件内容,并生成备份 (可选 SUFFIX 指定备份文件后缀)
-n禁用默认输出,仅输出 p 命令或其他指令显示的内容
-f scriptfile从外部文件读取 sed 脚本
-r 或 -E启用扩展正则表达式语法

4 sed 脚本命令

命令作用
s替换文本:将匹配的文本替换为指定的内容。 sed 's/old/new/' file:将每行第一个 old 替换为 new。
d删除匹配的行。 sed '/pattern/d' file:删除包含 pattern 的所有行。
p打印匹配的行。需要与 -n 参数配合使用,避免重复输出所有内容。 sed -n '/pattern/p' file:打印包含 pattern 的所有行。
a在指定行之后追加文本。 sed '3 a\new line' file:在第 3 行后追加 new line。
i在指定行之前插入文本。 sed '3 i\new line' file:在第 3 行前插入 new line。
c替换指定行的内容。 sed '2,4 c\new content' file:将第 2 到第 4 行替换为 new content。
q提前退出 sed。常用于处理大文件时,仅处理前几行或满足条件后退出。 sed '5q' file:读取到第 5 行后退出。
n读取下一行并应用脚本中指定的命令。 sed 'n;s/foo/bar/' file:对奇数行不做处理,对偶数行替换 foo 为 bar。
g在替换命令中,全局替换行中所有匹配的字符串。 sed 's/foo/bar/g' file:将每行所有的 foo 替换为 bar。
h将当前模式空间的内容复制到保持空间(hold space)。 sed '/pattern/h' file:将匹配 pattern 的行复制到保持空间。
H将当前模式空间的内容追加到保持空间(hold space)。 sed '/pattern/H' file:将匹配 pattern 的行追加到保持空间。
x交换保持空间和模式空间的内容。 sed 'x' file:交换当前行和之前保存的内容。
y替换字符(类似 tr 命令),逐字符进行转换,而非正则表达式匹配。 sed 'y/abc/123/' file:将 a 替换为 1,b 替换为 2,c 替换为 3。
=打印当前行号。 sed '=' file:打印每行的行号。
{}将多条命令组合在一起,用于同一范围或条件下执行多条操作。 sed '/pattern/{s/foo/bar/;d}' file:匹配 pattern 时替换 foo 为 bar 并删除整行。
:label定义标签,用于 b 或 t 命令跳转。 sed ':start; /pattern/b end; n; b start; :end' file:匹配 pattern 后跳到标签 end。
b无条件跳转到指定标签(或脚本末尾)。 sed '/pattern/b end' file:匹配 pattern 时跳转到标签 end。
t条件跳转:如果之前的替换成功,则跳转到指定标签(或脚本末尾)。 sed '/pattern/s/foo/bar/;t end' file:替换成功后跳到标签 end。
r从文件中读取内容并插入到当前行之后。 sed '/pattern/r otherfile' file:在匹配 pattern 的行后插入 otherfile 的内容。
w将模式空间的内容写入指定文件。 sed '/pattern/w output.txt' file:将匹配 pattern 的行写入 output.txt。
s///替换命令:可配合多个标志,如 g(全局)i(忽略大小写)p(打印替换的行)sed 's/foo/bar/g' file:将每行所有的 foo 替换为 bar。

5 参数使用说明

5.1 -e 参数

  • 作用:-e参数的作用是允许 sed 执行多条命令,即将多条操作组合在一个命令中,而不需要分开写多个 sed 命令。
  • 例子:读取 test 文件,并执行两个替换命令,把 hello 替换成 Hello,把 python 替换成 scala。
[root@doc-nginx opt] cat >test<<EOF
> hello java
> hello python
> java and python, hello
> EOF
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt]# 把 hello 替换成 Hello, python 替换成 scala
[root@doc-nginx opt] sed -e 's/hello/Hello/g' -e 's/python/scala/g' test
Hello java
Hello scala

5.2 -n 参数

  • 作用:-n 参数和 p 命令常常一起使用,-n 参数用于禁止默认输出,而 p 命令用于打印匹配的行。这使得 sed 只输出符合条件的行,而不显示其他行。
  • 例子:读取 test 文件,并输出包含 scala 的行。
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt]# 如果不带 -n 参数,sed 会默认输出文件的内容,而 p 命令则会输出匹配的内容
[root@doc-nginx opt] sed '/python/p' test
hello java
hello python
hello python
java and python, hello
java and python, hello
[root@doc-nginx opt] 
[root@doc-nginx opt] sed -n '/python/p' test
hello python
java and python, hello

5.3 -f 参数

  • 作用:-f 参数用于指定一个包含 sed 脚本的文件,从而让 sed 按照文件中的指令逐行处理输入内容。这适用于需要执行多条复杂命令的场景,避免在命令行中书写繁琐的代码。
  • 例子:创建一个 sed 的脚本文件,目的是把 hello 替换成 Hello,把 python 替换成 scala。
[root@doc-nginx opt]# 创建 sed.script,包含两条脚本
[root@doc-nginx opt] cat >sed.script<<EOF
> s/hello/Hello/g  # 把 hello 替换成 Hello
> s/python/scala/g # 把 python 替换成 scala
> EOF
[root@doc-nginx opt] 
[root@doc-nginx opt] sed -f sed.script test
Hello java
Hello scala
java and scala, Hello

5.4 -i 参数

  • 作用:-i 参数用于直接修改源文件(即在原地编辑文件内容),而不是将结果输出到标准输出或另一个文件。这个参数特别适用于需要对文件进行批量修改的场景。
  • 例子:读取 test 文件,并把 hello 替换成 perfect,再次读取 test 文件确定文件已被修改。
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt] 
[root@doc-nginx opt] sed -i 's/hello/perfect/g' test
[root@doc-nginx opt]# 再次读取文件,发现文件已被修改
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect

6 sed 命令使用说明

6.1 s 命令

  • 格式:s/old/new/
  • 作用:将匹配的文本替换为指定的内容。

上面在介绍 sed 参数时,已大量使用了 s 命令,因此不再举例。

6.2 d 命令

  • 作用:d 命令用于删除匹配的行,它可以根据模式匹配删除指定行或范围的行。sed 处理文件时默认输出每一行,但使用 d 命令后,匹配的行将被删除且不会输出。
  • 例子1:删除匹配包含 java 的行,命令为 /java/d
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect
[root@doc-nginx opt] sed '/java/d' test
perfect python
  • 例子2:删除第三行,命令为 3d
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
[root@doc-nginx opt] 
[root@doc-nginx opt] sed '3d' test
perfect java
perfect python
  • 例子3:删除第二至第三行,命令为 2,3d
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
[root@doc-nginx opt] 
[root@doc-nginx opt] sed '2,3d' test
perfect java
  • 例子4:使用正则表达式,删除空行,命令为 /^$/d
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	
     3	
     4	perfect python
     5	
     6	
     7	java and python, perfect
[root@doc-nginx opt] 
[root@doc-nginx opt] sed '/^$/d' test
perfect java
perfect python
java and python, perfect

6.3 p 命令

  • 作用:p 命令用于打印匹配的行。在 sed 中,默认会将所有行输出,但配合 -n 参数时可以抑制默认输出,使得 p 命令只打印特定的行。
  • 例子1:打印包含 java 的行,命令为 /java/p
[root@doc-nginx opt]# sed -n '/java/p' test
perfect java
java and python, perfect
  • 例子2:打印第 5 行,命令为 5p
[root@doc-nginx opt] cat test -n
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell 
[root@doc-nginx opt]# 
[root@doc-nginx opt] sed -n '5p' test
hello shell
  • 例子3:打印第 2 行到第 4 行,命令为 2,4p
[root@doc-nginx opt] sed -n '2,4p' test
perfect python
java and python, perfect
hello golang
  • 例子4:匹配包含 java 的行, 并把 java 替换成 JAVA ,打印,命令为 s/java/JAVA/p
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect
hello golang
hello shell

[root@doc-nginx opt] sed -n 's/java/JAVA/p' test
perfect JAVA
JAVA and python, perfect
  • 例子5:在第 2 行到第 3 行 中,匹配包含 java 的行, 并把 java 替换成 JAVA ,打印,命令为 2,3{s/java/JAVA/p}
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
     
[root@doc-nginx opt] sed -n '2,3{s/java/JAVA/p}' test
JAVA and python, perfect
  • 例子6:删除包含 hello 的行,并打印剩余的行,命令为 ``
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
[root@doc-nginx opt] 
[root@doc-nginx opt] sed -n '/hello/d;p' test
perfect java
perfect python
java and python, perfect

6.4 a 命令

  • 作用:a 命令用于在指定的行后面追加新内容。这是 sed 中一个强大的插入命令,可以在特定行之后插入文本。
  • 例子1:在第3行后追加一行,命令 3a\This is the new line.
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
[root@doc-nginx opt] 
[root@doc-nginx opt] sed '3a\This is the new line.' test
perfect java
perfect python
java and python, perfect
This is the new line.
hello golang
hello shell
  • 例子2:匹配 java 的行,并在每行后追加 java 666,命令为 /java/a\java 666
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '/java/a\java 666' test
perfect java
java 666
perfect python
java and python, perfect
java 666
hello golang
hello shell
  • 例子3:在结尾插入一行 I am the last row,命令为 $a\I am the last row
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '$a\I am the last row' test
perfect java
perfect python
java and python, perfect
hello golang
hello shell
I am the last row
  • 例子4:动态在第二行后追加 I am the third row,命令为 2a\I am the third row
[root@doc-nginx opt] cat -n test
     1	perfect java
     2	perfect python
     3	java and python, perfect
     4	hello golang
     5	hello shell
[root@doc-nginx opt] 
[root@doc-nginx opt] sed '2a\I am the third row' test
perfect java
perfect python
I am the third row
java and python, perfect
hello golang
hello shell
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值