作用
采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
- 将执行结果输出。
当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
语法
sed [-nefri] [n1[,n2]]function
参数
选项 | 含义 |
---|---|
-e | 该选项会将其后跟的脚本命令添加到已有的命令中。 |
-f filename | 该选项会将其后文件中的脚本命令添加到已有的命令中。 |
-n | 安静模式。在sed的一般用法中,所有来自文件中的数据都会被列出到屏幕上,如果加上-n,则只有经过sed特殊处理的那行(或操作)才会被列出来。 |
-r | 使用扩展正则表达式 |
-i | 此选项会直接修改源文件,要慎用。 |
[n1[,n2]]
表示选择操作的行数- function
i :插入,在目标行的上面新增一行。
a :插入,在目标行的下面新增一行。
d :删除所选行。
p :打印,也就是将某个选择的数据打印出来,通常参数-p与参数-n搭配使用。
s :替换,可以直接进行替换的工作。
c :替换,c的后面可以接替字符串,这些字符串可以替换n1,n2之间的行。
w :写并追加模板块到file末尾。
W : 写并追加模板块的第一行到file末尾。
! :表示后面的命令对所有没有被选定的行发生作用。
= :打印当前行号; # 把注释扩展到下一个换行符以前。
sed s 替换脚本命令 基本格式为:
[n1[,n2]]s/pattern/replacement/flags
sed s替换脚本命令支持正则表达来匹配旧的字符串。
flags 标记 | 功能 |
---|---|
n | 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; |
g | 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; |
p | 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 |
w file | 将缓冲区中的内容写到指定的 file 文件中; |
& | 用正则表达式匹配的内容进行替换; |
\n | 匹配第 n 个子串,该子串之前在 pattern 中用 \(\) 指定。 |
\ | 转义(转义替换部分包含:&、\ 等)。 |
使用实例
以行为单位的新增删除功能
[root@Ethan ~]# last | nl | head -n 5
1 root pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
2 root pts/1 117.80.141.145 Fri Mar 20 08:41 still logged in
3 root pts/0 117.80.141.145 Fri Mar 20 07:44 still logged in
4 root pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)
5 root pts/2 183.209.104.137 Sat Mar 14 19:40 - 22:20 (02:39)
删除行
[root@Ethan ~]# last | nl | head -n 5 | sed '2,3d'
1 root pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
4 root pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)
5 root pts/2 183.209.104.137 Sat Mar 14 19:40 - 22:20 (02:39)
新增行
[root@Ethan ~]# last | nl | head -n 5 | sed '2,3a New Line'
1 root pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
2 root pts/1 117.80.141.145 Fri Mar 20 08:41 still logged in
New Line
3 root pts/0 117.80.141.145 Fri Mar 20 07:44 still logged in
New Line
4 root pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)
5 root pts/2 183.209.104.137 Sat Mar 14 19:40 - 22:20 (02:39)
新增多行数据,以“\”来换行。
[root@Ethan ~]# last | nl | head -n 5 | sed '2,3a New Line1\
> New Line2'
1 root pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
2 root pts/1 117.80.141.145 Fri Mar 20 08:41 still logged in
New Line1
New Line2
3 root pts/0 117.80.141.145 Fri Mar 20 07:44 still logged in
New Line1
New Line2
4 root pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)
5 root pts/2 183.209.104.137 Sat Mar 14 19:40 - 22:20 (02:39)
以行为单位的替换与显示功能
多行替换
[root@Ethan ~]# last | nl | head -n 5 | sed '2,3c New Line'
1 root pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
New Line
4 root pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)
5 root pts/2 183.209.104.137 Sat Mar 14 19:40 - 22:20 (02:39)
输出指定行
[root@Ethan ~]# last | nl | head -n 5 | sed -n '2,3p'
2 root pts/1 117.80.141.145 Fri Mar 20 08:41 still logged in
3 root pts/0 117.80.141.145 Fri Mar 20 07:44 still logged in
部分数据的查找并替换功能
[root@Ethan ~]# last | nl | head -n 5 | sed 's/root/admin/g'
1 admin pts/3 117.80.141.145 Fri Mar 20 09:43 still logged in
2 admin pts/2 117.80.141.145 Fri Mar 20 09:17 still logged in
3 admin pts/1 117.80.141.145 Fri Mar 20 08:41 still logged in
4 admin pts/0 117.80.141.145 Fri Mar 20 07:44 still logged in
5 admin pts/0 183.209.104.137 Sun Mar 15 16:32 - 18:51 (02:19)