首页 > 编程笔记 > Linux命令

Linux sed命令用法详解

sed 的全称为 stream editor,它是 Linux 系统里的一个流编辑器,流编辑器非常适合执行重复的编辑操作,这种重复编辑的工作如果由人工手动完成,会花费大量的时间和精力,使用此工具可以简化对文件的反复操作,提高工作效率。

Vim 编辑器采用的是交互式文本编辑模式,用户可以用键盘交互式地添加、修改或删除文本中的内容,而 sed 采用流编辑模式,最明显的特点就是 sed 在处理数据之前,需要预先提供一组“操作”,sed 会按照此“操作”来自动处理数据。

sed 处理数据的流程如下:
  1. 每次仅读取一行内容;
  2. 把当前要处理的行存储在临时缓冲区中,这个临时缓冲区可以称为“模式空间”(Pattern Space);
  3. sed 命令会根据之前提供的“操作”处理缓冲区中的内容;
  4. 处理完成后,把缓冲区的内容输出到屏幕上;
  5. 处理下一行,不断重复,直到文件末尾。

需要注意的是,sed 默认不直接修改源文件的内容,而是把数据复制到缓冲区中,修改也仅限于缓冲区中的数据,再将修改后的数据输出到屏幕。如果想要直接修改源文件中的内容可以使用 -i 选项。

sed 命令的语法格式如下:
sed [选项] 'script' 文件名
注意,'script' 中包含两个内容,一个是地址定界,明确我们要操作的范围;另一个是操作命令,例如替换、插入、删除某行等。

sed 命令的常用选项见下表。

表 1 sed命令的常用选项
常用选项 说  明
-i 直接编辑源文件内容,而不是输出到屏幕上
-e 'script' 在 sed 命令中指定多个 script,多点编辑功能,同时完成多个 "操作”
-n 取消默认的自动输出,sed 默认会在屏幕上输出所有文本内容,使用 -n 选项后只显示处理过的行
-r 支持使用扩展正则表达式

'script' 的地址边界(定界)见下表。

表 2 'script' 的地址边界(定界)
操作范围 操作符 说  明
不给地址   默认对全文进行处理
单地址 n 指定第 n 行,对此行进行编辑操作
/pattern/ 指定模式匹配到的每一行,这里的模式匹配用的是标准正则表达式,若想使用扩展正则表达式则需要用 -r 选项
地址范围 nm 从第 n 行开始至第 m 行的范围
n, +m 从第 n 行开始至往后 m 行的范围
n, /pattern/ 从第 n 行开始,至指定模式匹配到的那一行
/pattern1/, /pattern2/ 从 pattern1 模式匹配开始,至 pattern2 模式匹配之间的范围
步进 1~2 以 1 为起始行,步进 2 行向下匹配,表示所有的奇数行
2~2 以 2 为起始行,步进 2 行向下匹配,表示所有的偶数行

'script' 的操作命令如下:
1) a:在匹配的行下面插入指定的内容,a 命令的位置在定界后面,不加边界表示文件的每一行,插入多行内容使用 \n 进行分割。例如,
2) i:在匹配的行上面插入指定的内容,i 命令的位置在定界后面,使用方式与命令 a 基本一样。

3) c:将匹配的行替换为指定的内容,c 命令的位置在定界后面。例如,
4) d:删除匹配的行,d 命令的位置在定界后面。例如:
5) y:替换匹配的字符,可以替换多个字符但不能替换字符串,也不支持正则表达式。在替换多个字符时,源字符和目标字符中的每个字符都需要一一对应,个数不能多也不能少。例如 sed 'y/123/abc/' 1.txt 表示将 1.txt 文件中的字符 1、字符 2、字符 3 替换为字符 a、字符 b、字符 c。

6) r:读取指定文件内容并添加到目标文件指定行的下面。例如 sed '2r/etc/passwd' 1.txt 表示读取 /etc/passwd 文件中的内容并插入 1.txt 文件第 2 行的下面。

7) [address]s/pattern/replacement/flags:操作命令 s 表示条件替换,是 sed 中用得最多的操作命令,因为支持正则表达式,所以功能十分强大,下面介绍各部分含义:
8) flags:标记或功能,包括下面几个:
【实例 1】使用 s 命令可以替换文本,例如将文件 example.txt 中所有的 "old" 替换为 "new":
sed 's/old/new/g' example.txt

【实例 2】如果想替换文本并打印结果,可以使用 -e 选项。例如,将文件中所有 "old" 替换为 "new" 并打印结果:
sed -e 's/old/new/g' example.txt

【实例 3】使用 a 命令可以在文件的指定位置追加文本。例如,在文件的最后一行之后追加一行文本 "This is another new line":
sed -i '$a This is another new line' example.txt

推荐阅读