sed命令
sed命令
sed, 即Stream Editor,是linux系统中一种行编辑器
用法
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
常用选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 直接在源文件上修改,且不备份
-i.bak 对源文件进行备份,文件名FILE.bak,然后在源文件上编辑
script
script中的内容可以分为两大类,地址定界和命令。
地址定界,即对需要匹配的行划定范围,可以通过指定具体的行数,比如5,或者2到9行;也可以通过正则表达式来确定。
命令,即对通过地址匹配到的行进行的操作,包括打印、删除等。
地址定界
- 不给地址:对全文进行处理
- 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
- 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
- ~:步进
1~2 奇数行
2~2 偶数行
编辑命令
d 删除模式空间匹配的行
p 显示模式空间中的内容
a [\]text 在指定行后面追加文本
支持使用\n实现多行追加
i[\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中
匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
搜索查找操作
s/// 查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/FILE:将替换成功的行保存至文件中
测试1——查看(可以完成grep命令能做的大部分任务)
创建一个文件test文件,往里写入1, 2, ...
-
[root@vathe-pc tmp]#seq 1 14 > test # 创建test文件 [root@vathe-pc tmp]#head -6 test # 查看前6行 1 2 3 4 5 6
单地址
- 查看该test文件
-
[root@vathe-pc tmp]#sed '' test # 中间单引号不能省略,表示不做处理 1 2 3 4 5
sed 命令默认会把每行内容都打印一篇,故而执行上面的命令,会打印全文;使用-n 选项就不会打印,可以尝试如下命令
-
[root@vathe-pc tmp]#sed -n '' test [root@vathe-pc tmp]#
- 查看第3行
-
[root@vathe-pc tmp]#sed -n '3p' test # p命令,表示打印print 3 [root@vathe-pc tmp]#sed '3!d' test # d命令,表示删除delete 3
上面两条命令均可查看特定行,区别在于:
第一条默认不打印,搜索到第3行,然后打印
第二条命令,默认会打印每一行,“3!”表示不是第三行,“d”命令表示删除,则“3!d”表示不是第三行,就删除——不打印。
- 查看出现’root’字符串的行
-
[root@vathe-pc tmp]#cp /etc/passwd ./ # 复制文件 [root@vathe-pc tmp]#sed -n '/root/p' passwd root:x:0:0:root:/root:/bin/bash
- 下面为passwd文件的前14行
-
[root@vathe-pc tmp]#cat -n passwd # 查看 passwd 文件 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin 13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 14 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ...
范围地址查看
- 查看5至8行
-
[root@vathe-pc tmp]#sed -n '5,8p' test 5 6 7 8
- 打印第3行,至出现‘halt’字符的行
-
[root@vathe-pc tmp]#sed -n '3,/halt/p' passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
测试2——修改
行后添加。搜索含有”halt”字符的行,在每行后添加’github.com’
[root@vathe-pc tmp]#sed '/halt/a\github.com' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt # 搜索到的行 github.com # 添加的字符 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
行前添加。搜索含有”adm”字符的行,在每其每行前添加’github.com’
[root@vathe-pc tmp]#sed '/adm/i\github.com' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin github.com adm:x:3:4:adm:/var/adm:/sbin/nologin ...
代替行内容。搜索含有‘2’字符的行,将其替换为‘100’
[root@vathe-pc tmp]#sed '/2/c\100' test 1 100 # 原来为2 3 4 5 6 7 8 9 10 11 100 # 原来为12 13 14
测试3——查询替换
- 查询‘adm’字符串,查找到之后,将其替换为’admin’字符串
-
[root@vathe-pc tmp]#grep 'adm' passwd adm:x:3:4:adm:/var/adm:/sbin/nologin [root@vathe-pc tmp]#sed -n 's/adm/admin/p' passwd admin:x:3:4:adm:/var/adm:/sbin/nologin # 仅替换第一个adm [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd admin:x:3:4:admin:/var/admin:/sbin/nologin # 都替换了 [root@vathe-pc tmp]#
// 后一条命令g选项表示,匹配到的行,行中所有的“adm”都替换为“admin”
- 在单词‘halt’后添加‘ing’字符串
-
[root@vathe-pc tmp]#grep halt passwd halt:x:7:0:halt:/sbin:/sbin/halt [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd admin:x:3:4:admin:/var/admin:/sbin/nologin
高级编辑命令
h: 把模式空间中的内容覆盖至保持空间中
H: 把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G: 从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N: 读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D: 删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
高级用法示例
sed 'n;d' FILE # 查看奇数行
sed -n 'n;p' FILE # 查看偶数行
sed '1!G;h;$!d' FILE # 逆向查看文件,类似于tac FILE
sed '$!N;$!D' FILE # 查看倒数两行
sed '$!d' FILE # 查看最后一行
sed ‘G’ FILE # 在每行后追加一空行