文本处理工具之sed 1、sed是一种行编辑器,对文本逐行处理。处理时,它会将文本行载入"模式空间"(临时缓冲区),接着用sed命令对模式空间的内容进行处理,处理完成后,将模式空间内容输出到显示屏 与之类似的处理工具还有grep和awk,相比grep,sed不仅对文本有过滤功能,还可以对文本进行其他增删改的操作。而相比awk,sed显得更加简单高效。下面我们就来细说"sed"。 2、用法:sed [options] '地址 指令’ file...... options:一些功能选项 地址:匹配范围,可以是单行、多行,或者是匹配模式的行,模式支持正则表达式。 指令:是sed自带的文本处理命令,如打印、删除、更改等。以下做详细解释 options -n 不打印模式空间 -e 多点编辑,同时处理多条指令 -f 读取脚本文件 -r 使其支持扩展正则表达式 -i 直接修改原文件 地址 1 首行 n 指定行 $ 尾行 n1,n2 从n1到n2之间所有的行 n1,+10 从n1开始算起,之后的10行 /patter/ 匹配该模式的行,支持正则 /pat1/,/pat2/ 两个匹配行之间的行,第一次匹配pat1,和第一次匹配part2之间的行。如果只匹配pat1,sed会打印pat1到行尾的所有行 n1~n2 ~代表步进,以n1为基准,n2为跳数匹配。如:1~2,就是打印奇数行 指令 p 打印模式空间处理行和过滤行,常与-n一起使用,只打印过滤行 d 删除过滤行 = 打印行号 q 退出脚本 r 读取文件,通常与aic一起使用 w 将匹配内容输出到文件 a\text 在匹配行后追加文本 i\text 在匹配行前面追加文本 c\text 替换匹配行内容 ! 通常在 '地址' 后面,表示取反 & 引用前面的字符串 s///(g|p|w) 查找替换 示例: 打印匹配行 #sed -n '1p' /etc/passwd ##打印首行 #sed -n '$p' /etc/passwd ##打印尾行 #sed -n '1,3p' /etc/passwd ##打印前三行 #sed -n '1,3!p' /etc/passwd ##打印除前三行之外的行 #sed -n '/root/,3p' /etc/passwd ##打印匹配root到第三行之间的行 #sed -n '/postfix/,$p' /etc/passwd ##打印匹配行到尾行之间的行 #sed -n -e '1p' -e '$p' /etc/passwd ##使用-e命令同时处理多条指令 #sed '/root/a\########' /etc/passwd ##行后追加 #sed '/root/i\########' /etc/passwd ##行前追加 #sed '/root/c\########' /etc/passwd ##替换匹配行 删除匹配行 #sed '1d' /etc/passwd ##删除首行 #sed '1~2d' /etc/passwd ##删除奇数行 #sed '10,$d' /etc/passwd ##删除10行以后的行 文本替换 #sed -n 's/root/ROOT/p' /etc/passwd ##将每行首次出现的root替换为ROOT,并打印过滤行 #sed -n 's/root/ROOT/2p' /etc/passwd ##将文本行中第二次出现的root替换为ROOT,打印该行 #sed -n 's/root/ROOT/gp' /etc/passwd ##将全文出现的root全部替换成大写,并打印过滤行 #sed -n 's/bin/&2/gp' /etc/passwd ##全文搜索,将bin替换成bin2,打印这些行 实用的应用场景 #sed '/^#/d;/^$/d' /etc/fstab ##去掉/etc/fstab中空行和以#开头的行 #sed -r 's@([^:]+):(.*):([^:]+)@\3:\2:\1@' /etc/passwd ##将/etc/passwd文件中用户名和默认shell替换位置 --------上述示例,很好的利用了正则的分组匹配 --------([^:]+)表示匹配(非:字符一次以上) #sed '10,$s/^/#/' /etc/passwd ##为10行及其之后的行添加#注释符 3、sed高级功能 sed除了以上基本的文本处理能力外,还具备一些高级用法。 保持空间:和模式空间一样,也是在sed命令执行的时候,内存给其分配的一块缓冲空间。相比模式空间,保持空间只是一块临时存储空间,其内容不会直接被sed命令处理输出到屏幕 高级编辑命令 h 将模式空间内容覆盖至保持空间 H 将模式空间内容追加至保持空间 g 将保持空间内容覆盖模式空间 G 将保持空间内容追加至模式空间 x 将保持空间内容和模式空间互换 n 读取匹配行的下一行覆盖至模式空间 N 读取匹配行的下一行追加至模式空间
如图: h:执行h命令,保持空间内容将变为a。 H:执行H命令,保持空间内容将变为a\nb\nc\n g:执行g命令,模式空间将变为b\nc G:执行G命令,模式空间内容变为a\nb\nc x:执行x命令,模式空间内容变为b\nc,保持空间内容变为a 二者互换 n:执行n命令,模式空间内容直接变为d,a直接覆盖,不做任何处理 N:执行N命令,模式空间内容将变为a\nd 示例 (如上图,txt为a b c d e f 六行内容) #sed -n 'n;p' txt 该命令打印txt偶数行 b d f #sed '1!G;h;$!d' txt ##1!G:表示只要不是第一行,都执行G命令。$!d:表示只要不是最后一行,都执行d命令 f e d c b a #sed '$!N;$!D' txt ##$!N:表示只要不是最后一行就执行N命令;$!D:表示只要不是最后一行就执行D命令 e f #sed -n '1!G;h;$p' txt ##1!G:表示只要不是第一行就执行G命令,$p:表示最后一行执行p命令 f e d c b a 综上:sed命令操作简洁、高效,是linux下必学文本处理工具之一,灵活掌握sed用法,对编写脚本起到很大的帮助
原创文章,作者:Abigheart,如若转载,请注明出处:http://www.178linux.com/71288
评论列表(1条)
通俗易懂,逻辑清晰,循环渐进,实乃经典中的经典!!