一, 基本概述 (1)基本介绍 sed是一款流编辑工具,用来对文本进行过滤与替换工作, sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,sed更适合于处理大数据文件。 sed在处理文本文件的时候,会在内存上创建一个模式空间,然后把这个文件的每一行调入模式空间用相应的命令处理,处理完输出;接着处理下一行,直到最后。 (3)与vim的区别 vim需要通知处理文件的哪几行才会去处理,sed默认会处理文件的所有行,除非你告诉它不处理哪几行。 二, sed的基本语法 (1)sed [选项] [定址commands] [inputfile] 关于定址: 定址可以是0个、1个、2个;通知sed去处理文件的哪几行。 0个:没有定址,处理文件的所有行 1个:行号,处理行号所在位置的行 2个:行号、正则表达式,处理被行号或正则表达式包起来的行 (2) 选项: --version 显示sed版本hao --help 显示帮助文档 -n 关闭默认输出,默认将自动打印所有行 -e 多点编辑,允许多个脚本指令被执行。 -r 支持扩展正则+ ? () {} | -i 可以修改原文件,慎用! -f 支持使用脚本 命令: p打印行 d 删除行 s 替换 n替换第几个匹内容 w另存为 a 之后添加一行 i 当前行之前插入文本 y 替换匹配内容
三, 实际案例讲解 (1)p(与-n合用) 查看passwd文件的1~3行 @1,打印一到三行 [root@tx3 ~]# cp /etc/passwd /t1 [root@tx3 ~]# cat -n t1 | sed -n '1,3p' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,查看passwd文件的lp~halt行 [root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p' 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8halt:x:7:0:halt:/sbin:/sbin/halt @3, 打印基数行(从第一行开始,每隔一行一输出) @4,打印uid是0或1的行 [root@tx3 ~]# sed -n '/x:[01]:/p' t1 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 删除 @1,删除第一行 @2,删除第一行和第三行(与-e选项合用) @3,;选项的使用和-e一样 @4,取反:! [root@tx3 ~]# cat -n t1 | sed '1!d' 1root:x:0:0:root:/root:/bin/bash (3)s 查找替换 s/// 语法: '[address]s/pattern/replacement/flags' old new flags: n:1-512 之间的正整数,表示替换模式里面出现的第几次内容 p:打印 g:全局修改 w:另存为 这几个选项是可以复合使用的,但是写的要有意义。(pg ;nw) 注:这里为部分截取 @1默认会替换行里面的第1个匹配 [root@tx3 ~]# sed 's/root/ROOT/' t1 ROOT:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin @2全部替换 [root@tx3 ~]# sed 's/root/ROOT/g' t1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin @3替换第2个匹配 [root@tx3 ~]# sed 's/root/ROOT/2' t1 root:x:0:0:ROOT:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin @4打印 [root@tx3 ~]# sed 's/root/ROOT/p' t1 ROOT:x:0:0:root:/root:/bin/bash ROOT:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin‘ [root@tx3 ~]# sed -n 's/root/ROOT/p' t1 ROOT:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/ROOT:/sbin/nologin @5另存为 [root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1 [root@tx3 ~]# cat /tx ROOT:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/ROOT:/sbin/nologin @6在文件的每行前面添加 # 注释 [root@tx3 ~]# sed 's/^/#/' t1 #root:x:0:0:root:/root:/bin/bash #bin:x:1:1:bin:/bin:/sbin/nologin #daemon:x:2:2:daemon:/sbin:/sbin/nologin @7删掉文件的第1个字符 [root@tx3 ~]# sed 's/^.//1' t1 oot:x:0:0:root:/root:/bin/bash in:x:1:1:bin:/bin:/sbin/nologin aemon:x:2:2:daemon:/sbin:/sbin/nologin
@8删掉文件的第2个字符 [root@tx3 ~]# sed 's/.//2' t1 rot:x:0:0:root:/root:/bin/bash bn:x:1:1:bin:/bin:/sbin/nologin
(4)i 从当前行插入 在第一行前插入hello [root@tx3 ~]# sed '1i hello' t1 hello root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin (5)a 从当前行后添加 在第一行后添加hello [root@tx3 ~]# sed '1a hello' t1 root:x:0:0:root:/root:/bin/bash hello bin:x:1:1:bin:/bin:/sbin/nologin
(6)-r 支持扩展正则 [root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1 rot:x:0:0:root:/root:/bin/bash //相当于把前两个字符替换成第一个字符,这样就实现了删除第二个字符 bn:x:1:1:bin:/bin:/sbin/nologin demon:x:2:2:daemon:/sbin:/sbin/nologin 其他方法: @1#sed 's/.//2' t1 @2#sed 's/^\(.\)\(.\)/\1/' t1
(7)y 替换,按照位置来匹配替换 y/// 不识别re
[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1 ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN (8)替换匹配行 @1[root@tx3 ~]# sed -n '1c ROOT' t1 ROOT (9)q 退出 [root@tx3 ~]# sed '1q ' t1 root:x:0:0:root:/root:/bin/bash (10)-i 可以修改原文件 (11)-f 支持脚本 四.sed如何处理数据
PATT:模式空间,处理文件的输入行,处理文件的空间,最多保存8192字节,相当于车间sed把流内容在这里处理。 HOLD:保留空间,用来保存已经处理的输入行;最多保存8192字节;默认有一个空行,相当于仓库,加工的半成品在这里临时储存。
COMM:命令 h:将模式空间里的内容,复制到保留空间里,覆盖原来的内容 > H:将模式空间里的内容,追加到保留空间里,保留原来的内容 >> g:将保留空间里的内容,复制到模式空间里,覆盖原来的内容 G:将保留空间里的内容,追加到模式空间里,保留原来的内容 n:对匹配行的下一行进行处理 x:交换模式空间和保留空间的内容 (1)h;G @1.将第一行的内容放到打三行后面 @2.在每行的后面添加1个空行 注:1.保留空间里默认有一个空白行。2,‘G’默认处理全局 @3.把第1行到第4行的数据复制到第5行后面 注:1h是为了覆盖保留空间里的空白行 @4. 把第1行到第4行的数据剪切到第5行后面 (2)n 对匹配行的下一行进行处理 (3)x 交换模式空间和保留空间的内容 |
|