Shell脚本之sed详解

一, 基本概述

(1)基本介绍

sed是一款流编辑工具,用来对文本进行过滤与替换工作,  sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,sed更适合于处理大数据文件。
(2)工作原理

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, 打印基数行(从第一行开始,每隔一行一输出)

Shell脚本之sed详解_sed

@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,删除第一行

Shell脚本之sed详解_sed_02

@2,删除第一行和第三行(与-e选项合用)

Shell脚本之sed详解_sed_03

@3,;选项的使用和-e一样

Shell脚本之sed详解_sed_04

@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        可以修改原文件

Shell脚本之sed详解_sed_05

(11)-f 支持脚本

Shell脚本之sed详解_sed_06

四.sed如何处理数据


    PATT:模式空间,处理文件的输入行,处理文件的空间,最多保存8192字节,相当于车间sed把流内容在这里处理。

    HOLD:保留空间,用来保存已经处理的输入行;最多保存8192字节;默认有一个空行,相当于仓库,加工的半成品在这里临时储存。


COMM:命令

h:将模式空间里的内容,复制到保留空间里,覆盖原来的内容 >

H:将模式空间里的内容,追加到保留空间里,保留原来的内容 >>

g:将保留空间里的内容,复制到模式空间里,覆盖原来的内容

G:将保留空间里的内容,追加到模式空间里,保留原来的内容

n:对匹配行的下一行进行处理

x:交换模式空间和保留空间的内容

(1)h;G

@1.将第一行的内容放到打三行后面

Shell脚本之sed详解_sed_07

@2.在每行的后面添加1个空行

注:1.保留空间里默认有一个空白行。2,‘G’默认处理全局

Shell脚本之sed详解_sed_08

@3.把第1行到第4行的数据复制到第5行后面

注:1h是为了覆盖保留空间里的空白行

Shell脚本之sed详解_sed_09

@4. 把第1行到第4行的数据剪切到第5行后面

Shell脚本之sed详解_sed_10

(2)n    对匹配行的下一行进行处理

Shell脚本之sed详解_sed_11

(3)x     交换模式空间和保留空间的内容

Shell脚本之sed详解_sed_12