首页 > 编程笔记
Linux sed命令用法详解
sed 的全称为 stream editor,它是 Linux 系统里的一个流编辑器,流编辑器非常适合执行重复的编辑操作,这种重复编辑的工作如果由人工手动完成,会花费大量的时间和精力,使用此工具可以简化对文件的反复操作,提高工作效率。
Vim 编辑器采用的是交互式文本编辑模式,用户可以用键盘交互式地添加、修改或删除文本中的内容,而 sed 采用流编辑模式,最明显的特点就是 sed 在处理数据之前,需要预先提供一组“操作”,sed 会按照此“操作”来自动处理数据。
sed 处理数据的流程如下:
需要注意的是,sed 默认不直接修改源文件的内容,而是把数据复制到缓冲区中,修改也仅限于缓冲区中的数据,再将修改后的数据输出到屏幕。如果想要直接修改源文件中的内容可以使用 -i 选项。
sed 命令的语法格式如下:
sed 命令的常用选项见下表。
'script' 的地址边界(定界)见下表。
'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":
【实例 2】如果想替换文本并打印结果,可以使用 -e 选项。例如,将文件中所有 "old" 替换为 "new" 并打印结果:
【实例 3】使用 a 命令可以在文件的指定位置追加文本。例如,在文件的最后一行之后追加一行文本 "This is another new line":
Vim 编辑器采用的是交互式文本编辑模式,用户可以用键盘交互式地添加、修改或删除文本中的内容,而 sed 采用流编辑模式,最明显的特点就是 sed 在处理数据之前,需要预先提供一组“操作”,sed 会按照此“操作”来自动处理数据。
sed 处理数据的流程如下:
- 每次仅读取一行内容;
- 把当前要处理的行存储在临时缓冲区中,这个临时缓冲区可以称为“模式空间”(Pattern Space);
- sed 命令会根据之前提供的“操作”处理缓冲区中的内容;
- 处理完成后,把缓冲区的内容输出到屏幕上;
- 处理下一行,不断重复,直到文件末尾。
需要注意的是,sed 默认不直接修改源文件的内容,而是把数据复制到缓冲区中,修改也仅限于缓冲区中的数据,再将修改后的数据输出到屏幕。如果想要直接修改源文件中的内容可以使用 -i 选项。
sed 命令的语法格式如下:
sed [选项] 'script' 文件名注意,'script' 中包含两个内容,一个是地址定界,明确我们要操作的范围;另一个是操作命令,例如替换、插入、删除某行等。
sed 命令的常用选项见下表。
常用选项 | 说 明 |
---|---|
-i | 直接编辑源文件内容,而不是输出到屏幕上 |
-e 'script' | 在 sed 命令中指定多个 script,多点编辑功能,同时完成多个 "操作” |
-n | 取消默认的自动输出,sed 默认会在屏幕上输出所有文本内容,使用 -n 选项后只显示处理过的行 |
-r | 支持使用扩展正则表达式 |
'script' 的地址边界(定界)见下表。
操作范围 | 操作符 | 说 明 |
---|---|---|
不给地址 | 默认对全文进行处理 | |
单地址 | n | 指定第 n 行,对此行进行编辑操作 |
/pattern/ | 指定模式匹配到的每一行,这里的模式匹配用的是标准正则表达式,若想使用扩展正则表达式则需要用 -r 选项 | |
地址范围 | n, m | 从第 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 进行分割。例如,
- sed 'a B' 1.txt 表示在文件 1.txt 中每一行的下面都插入一行内容,内容为 B。
- sed '1,2a B' 1.txt 表示在文件 1.txt 中 1~2 行的下面插入一行内容,内容为 B。
- sed '1,2a B\nC\nD' 1.txt 表示在文件 1.txt 中 1~2 行的下面分别插入 3 行,3 行内容分别是 B、C、D。
2) i:在匹配的行上面插入指定的内容,i 命令的位置在定界后面,使用方式与命令 a 基本一样。
3) c:将匹配的行替换为指定的内容,c 命令的位置在定界后面。例如,
- sed 'c ABCDEF' 1.txt 表示将 1.txt 文件中所有行的内容都分别替换为指定内容,内容为 ABCDEF。
- sed '1,2c B' 1.txt 表示将 1.txt 文件中 1~2 行的内容替换为 B。注意这里的 1~2 行替换说的是将这两行所有的内容合到一起替换为一个内容,内容为 B。
- sed '1,2c A\nB\nC' 1.txt 表示将 1.txt 文件中 1~2 行内容分别替换为 A 和 B,多出来的一行可以理解为插入一行内容,内容为 C。这样等于是替换了两行内容又插入一行内容。
4) d:删除匹配的行,d 命令的位置在定界后面。例如:
- sed 'd' 1.txt 表示将 1.txt 文件中所有的行全部删除,因为不加边界所以表示文件的每一行。
- sed '1,3d' 1.txt 表示将 1.txt 文件中 1~3 行的内容删除。
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 中用得最多的操作命令,因为支持正则表达式,所以功能十分强大,下面介绍各部分含义:
- [address]:地址边界/定界。
- s:替换操作。
- /:分隔符,也可以使用其他的符号,例如,=、@、#等。
- pattern:需要替换的内容。
- replacement:要替换的新内容。
8) flags:标记或功能,包括下面几个:
- n:1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换操作。
- g:对所有匹配到的内容进行替换,或称为全局替换,如果没有 g 标记,则只会对第一次匹配成功的行进行替换操作。
- p:会打印在替换命令中指定模式匹配的行。此标记一般与 -n 选项搭配在一起使用。
- w file:将缓冲区中的内容另存到指定的文件中。
- &:用正则表达式匹配的内容进行替换。
- \n:匹配第 n 个子串,该标记会在 pattern 中用 \(\)指定。
【实例 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