Linux 命令之三剑客 sed

grep、sed、awk 被称为 linux 中的”三剑客”。

  • grep:更适合单纯的查找或匹配文本。
  • sed:更适合编辑匹配到的文本。
  • awk:更适合格式化文本,对文本进行较复杂格式处理。

简介

sed 是一个“交互式的”面向字符流的编辑器,它被认为是面向字符流的,这是因为输入流通过程序将输出直接送到标准输出端。输入一般来自文件,但也可可以直接来自键盘。输出在默认情况下是在终端的屏幕上,但是也可以输出到文件中,sed 能够通过解析脚本来工作,该脚本指定了将要执行的动作。

sed 在处理文件时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容发送到输出端,然后接着处理下一行,这样不断重复,直至文件末尾。这个过程中文件内容并没有改变,除非你使用重定向存储输出。sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

语法

1
2
3
4
5
6
7
8
9
10
11
12
sed [options] command file
sed [options] -f scriptfile file

options:
-n, --quiet, --silent 取消默认输出,实际上就是禁止它的默认的一个打印,因为sed会默认输出每一行
-r 指定使用扩展的正则表达式
-e script, --expression=script 在指令模式上进行sed的动作编辑
-f script-file, --file=script-file 指定脚本文件
-i[SUFFIX], --in-place[=SUFFIX] 编辑文件,直接修改文件内容
-c, --copy 使用复制代替重命名指定文件
-l N, --line-length=N 为l命令指定行数
-s, --separate 把文件作为独立的个体而不是单独连续的字符流

sed 四种定位模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1、数字定位法
eg:指定行号
sed '3d' [文件信息]
sed '2,3d' [文件信息]

2、正则定位法
eg:指定正则定位
sed '/^g/d' [文件信息]

3、数字和正则定位法
sed '3,/^g/d' [文件信息]

4、正则和正则定位法
sed '/^g/,/^j/d' [文件信息]

sed的编辑模式指令汇总如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
d:删除
p:打印
a: 在当前行后添加一行或多行
sed '2axxx' [文件信息]
c:用新文本修改(替换)当前行
sed '2cxxx' [文件信息]
i: 在当前行之前,插入文本(单独使用时)
sed '2ixxx' [文件信息]
r: 在文件中读内容
sed '2r r.txt' [文件信息]
w: 将指定行写入文件
sed '2w w.txt' [文件信息]
y: 将字符转换成另一个字符
sed '2y/fa/FA/' [文件信息]
s: 将字符串转换成另一个字符串(每一行只替换一次)
sed 's/11/22/' [文件信息]
g: 全局替换
sed 's/11/22/g' [文件信息]
i: 忽略大小写(跟 s 模式一起使用时)
&:代表前面匹配到的内容

示例

追加:

1
2
3
4
5
6
sed 'a\the end\' sed.txt  在所有行末尾追加一行“the end”
sed '$a\the end\' sed.txt 在最后一行末尾追加“the end”
sed '3,5a\the end\' sed.txt 在3到5末尾追加“the end”
sed 's/^/\#&/g' sed.txt 在每行开头加上“#”
sed 's/$/&\!/g' sed.txt 在文件中每行结尾加上“!”
sed '$r sed.txt' sed.txt 将文件sed.txt的内容追加到sed.txt的最后一行

插入:

1
2
sed 'i A' sed.txt 在每一行前插入“A”
sed '1i\begin\' sed.txt 在第一行前插入一行“begin”

替换:

1
2
3
4
5
sed '1,2c str' sed.txt  将1-2行替换为“str”(1-2行合并被替换)
sed 'y/ad/AD/' sed.txt 替换所有匹配字符“a”->“A”,“d”->“D”

# 批量替换IP地址
sed -r 's/192.168.0.([0-9]{1,2})/172.16.0.\1/g' sed.txt

删除:

1
2
3
4
5
6
7
8
9
10
11
12
13
sed -e '2d' sed.txt  删除第2
sed -e '3,$d' sed.txt 删除第3行到末尾
sed -e '$d' sed.txt 删除最后一行
sed -e '/^\#/'d sed.txt 删除以“#”开头的行
sed -i '/^$/d' sed.txt 删除空白行
sed 's/[ ]*//g' sed.txt 删除空格

sed 'N;$!P;D' sed.txt 删除倒数第2
sed 'N;$!P;$!D;$d' sed.txt 删除倒数2

# 若要删除最后n行,可参考如下:
max=$(sed -n '$=' sed.txt)
sed $(($A-n+1)),${A}d sed.txt

其他示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
sed '=' sed.txt         打印所有行号
sed '$=' sed.txt 打印最后一行的行号
sed -n '$=' sed.txt 打印总行数

sed -i.bak 's/123/321/g' sed.txt 修改文件前备份

# 将sed文件中包含“hello”字符串的行复制到temp文件中。
sed -e '/hello/w temp.txt' sed.txt

sed '/^$/d;G' sed.txt 删除所有空白行,并在每一行后面增加一个空行

sed -e '1h' -e '3x' sed.txt 将第1行的数据覆盖第3
sed '1h;3G' sed.txt 将第1行复制到第3行后面
sed '1h;1d;$g' sed.txt 将第1行剪切覆盖最后1

# 将包含“test”字符串的所有行上替换“123”->“321”,然后“cba”->“abc”
sed -e '/test/s/123/321/g' -e 's/abc/cba/g' sed.txt
sed -e '/test/s/123/321/g ; s/abc/cba/g' sed.txt

# 打印奇数行
sed -n -e 'P' -e 'N' sed.txt
sed -n 'p;n' sed.txt
sed -n '1~2p' sed.txt

# 打印偶数行
sed -n 'n;p' sed.txt
sed -n '2~2p' sed.txt

sed -r 's/(.)(.*)(.)$/\3\2\1/' sed.txt 每行最后一个字符与第一个字符互换

# 获取IP地址
ifconfig ens160|sed -ne 's/^.*inet \([0-9.]*\).*$/\1/p'
ifconfig ens160|sed -e '/inet/!d' -e 's/.*inet //' -e 's/[ ].*//' -e 3d

Linux 命令之三剑客 sed
https://flepeng.github.io/002-Linux-21-命令-Linux-命令之三剑客-sed/
作者
Lepeng
发布于
2021年7月5日
许可协议