### 概念 - stream editor的缩写 - 流编辑器,用来处理文件 - 一行一行读取文件,按照要求进行处理,并把结果输出到屏幕 - 对缓冲区中副本进行编辑,不会修改源文件 ### 运行模式 - 命令行模式 - 脚本模式 ### 命令行格式 - sed options ‘处理动作’ 文件名 ![294a6fb86ea2c755baf11d4517227967.png](../../_resources/294a6fb86ea2c755baf11d4517227967.png) - 常见处理动作 ![21f9477ffd1ea12c46e439205e44a117.png](../../_resources/21f9477ffd1ea12c46e439205e44a117.png) ### 举例 - 打印文件 `sed '' passwd` - 打印文件第2行 ``` me@me-EQ59:~/shell_demo$ sed -n '2p' passwd daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin me@me-EQ59:~/shell_demo$ ``` - 打印文件 1-4 行 ``` me@me-EQ59:~/shell_demo$ sed -n '1,4p' passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin me@me-EQ59:~/shell_demo$ ``` - 打印文件文件最后一行 ``` me@me-EQ59:~/shell_demo$ sed -n '$p' passwd gitlab-runner:x:1001:1001:GitLab Runner:/home/gitlab-runner:/bin/bash me@me-EQ59:~/shell_demo$ ``` - 文件第二行前插入内容 ``` me@me-EQ59:~/shell_demo$ sed -n '2ihello world' passwd hello world ``` - 文件第三行后插入内容 ``` sed -n '3ahello world' paswd ``` - 支持换行插入内容 ``` me@me-EQ59:~/shell_demo$ sed '3ihello\ world\ 999\ flal' file1 # 命令到这结束后 enter lfla fla hello world 999 flal flavnanv rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ ``` - 多行之间插入,在第二行和第三行和第四行前边插入内容 ``` me@me-EQ59:~/shell_demo $ sed '2,4ihello' file1 lfla hello fla hello flavnanv hello rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ ``` - 替换整行内容,替换第五行内容 ``` me@me-EQ59:~/shell_demo$ cat file1 lfla fla flavnanv rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ sed '5cheloworld' file1 lfla fla flavnanv rpprp heloworld me@me-EQ59:~/shell_demo$ ``` - 替换文件所有内容 sed 'hello world' file1 - 替换多行内容,替换 1-5 行的内容为 hello world ``` me@me-EQ59:~/shell_demo$ cat file1 lfla fla flavnanv rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ sed '2,4cheloworld' file1 lfla heloworld dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ ``` - fla 开头的行替换成 haha ``` me@me-EQ59:~/shell_demo$ cat file1 lfla fla flavnanv rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ sed '/^fla/chaha' file1 lfla haha haha rpprp dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ ``` - 删除第四行 `sed '4d' file1` - 删除 1 到 4 行 `sed '1,4d' file1` ### 其他命令 ![2d661ab455541517d45e666109787aab.png](../../_resources/2d661ab455541517d45e666109787aab.png) - 读取其他文件的内容到指定位置,读取/etc/hosts 文件的内容,放到 第一行下边 ``` me@me-EQ59:~/shell_demo$ sed '1r /etc/hosts' file1 lfla 127.0.0.1 localhost 127.0.1.1 me-EQ59 # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters fla flavnanv rpprp /usr/local /user/local/bin dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ ``` - 保存当前文件的多行到当前目下某一个文件内 ``` me@me-EQ59:~/shell_demo$ cat file1 lfla fla flavnanv rpprp /usr/local /user/local/bin dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ sed -n '2,4w another.txt' file1 me@me-EQ59:~/shell_demo$ ls another.txt EOF file1 hello_grep.txt ip.txt passwd passwd.bak scripts test1 me@me-EQ59:~/shell_demo$ cat another.txt fla flavnanv rpprp me@me-EQ59:~/shell_demo$ ``` - 保留匹配串,fla开头的行前边加注释 ``` me@me-EQ59:~/shell_demo$ cat file lfla fla flavnanv rpprp /usr/local /user/local/bin dbdfblbjaljl;ka me@me-EQ59:~/shell_demo$ sed -n 's/^fla/#&/gp' file #fla #flavnanv me@me-EQ59:~/shell_demo$ ``` - 多次编辑,打印包含 root 的行,以及行号 ``` me@me-EQ59:~/shell_demo$ sed -ne '/root/p;/root/=' passwd root:x:0:0:root:/root:/bin/bash 1 nm-openvpn:x:121:127:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin 40 me@me-EQ59:~/shell_demo$ ```