Linux命令 - Sed

     Sed 可以对几十个配置文件做统一修改(比如:过滤与替换)

     Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合处理大数据文件

     Sed通过文件或管道读取文件内容,对源文件不做更改,将读入的内容复制到缓冲区中(叫模式空间patter space),然后根据相应的指令对模式空间中的内容进行处理

并输出到标准输出(屏幕)


Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程进行处理


Sed语法格式:

用法:sed  [选项]....  {脚本指令}   [输入文件]....

Sed 参数:

Sed            --version                      显示sed版本

                   -n,--quiet,--silent        静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间的内容,该选项可以屏蔽自动打印

                  -e  script                       允许多个脚本指令被执行

                   -f   script-file              从文件中读取脚本指令,对编写自动脚本程序很实用

                  -i,--in-place                慎用,该选项将直接修改源文件。

                  -l N                              该选项指定l指令可以输出的行长度,l指令为输出非打印字符

                 --posix                         禁用GNU  sed  扩展功能。

                   -r                                 在脚本指令中使用扩展正则表达式

                  -s,--separate            默认情况下,sed将把输入的多个文件名作为一个长的连续的输入流,而GNU sed则允许把它们当做单独的文件。

                  -u,--unbuffered         最低限度的缓存输入与输出


Sed脚本指令基本格式:

[地址] 脚本指令

地址及时操作对象、行数,也可以是正则表达式

脚本指令也可以用花括号进行组合,是命令序列可以作用于同一个地址

address  {  

command1

command2

command3

}

注意:第一个命令可以和左花括号在同一行,单右花括号必须单独处于一行,此外,命令后添加空格会产生错误


sed操作地址匹配范例

如果不指定操作范围,则默认对文件的所有行操作

sed    ‘d’   test   将删除文件的所有行,  ‘2d’仅删除第二行



number    指定输入文件的唯一行号

first-step       指定以first开始,并指定操作步长为step,如1、2指定第一行、第三行、第五行......为操作地址。2~5指定第二行开始每5行匹配一次操作地址

sed   -n   ‘1~2p’    test.txt    #打印文件的奇数行

$                                  匹配文件的最后一行

/regexp/                   //中间包含的是正则表达式,通过正则表达式匹配操作地址。如果//中正则表达式为空,匹配最近一次正则表达式的匹配地址,后面会有范例

\cregexpc               \c 与c之间匹配扩展正则表达式,c字符可以使用任意字符替代

addr1,addr2         匹配从操作地址1到操作地址2的所有行

sed  ‘2,8d’     test.txt         #删除2~8之间的所有行

addr1,+N                      匹配地址1以及后面的N行内容



常用脚本指令:

a    append   追加                    i   insert  插入

s   substitution    替换                  d   delete   删除

c                         更改                l                     打印(显示非打印字符)

y                    按字符转换          L                    打印(不显示非打印字符)

p                    打印                    r                     读入文件内容

w                    保存至文件            q                  退出


sed       '2a   TYPE=Ethernet'   test.txt                                               #在第二行后追加TYPE=Ethernet

sed      '3i      TYPE=Ethernet'   test.txt                                              #在第三行前插入TYPE=Ethernet

sed       ‘s/yes/no/g ’     test.txt                                                            #将文件所有yes替换为no

sed         ‘3,4d’              test.txt                                                             #删除第3、4行的内容


不确定的操作对象 用 正则表达式来匹配

sed             ‘/ONBOOT/a   TYPE=Ethernet  ’  test.txt

sed             '/^GATEWAY/d'                               test.txt 


脚本指令也可以写在脚本里,然后调用这些指令

cat     sed.sh                  

sed    -f      sed.sh                   test.txt


执行多个指令的方法:

sed             ‘s/yes/no/;s/static/dhcp/’                  test.txt                      #用分号隔开指令

sed         -e     's/yes/no'        -e   's/static/dhcp'              test.txt          #使用-e参数


替换指令:s

 格式[address]s/pattern/replacement/flags

Flags标记可以是:n              1~512之间,把指定模式出现第n次进行替换

                                  g                                     对模式空间的所有匹配进行全局更改,没有g,在只第一次匹配被替换,如一行中有3个A,则仅替换第一个A。

                                  P                                     打印模式空间的内容

                                   w        file                        将模式空间的内容写到文件file中

replacement为字符串,用来替换与正则表达式匹配的内容,在replacement部分下,下列字符有特殊含义

&                           用正则表达式匹配的内容进行 替换

\n                          匹配第n个字串,该字串之前在pattern中用\(\)指定

\                             转义(转义部分包含:、&、\等)


列子:将test.sh文件中第二个<body>替换为</body>

[root@centos6  ~]cat    test.sh

<html>

<title>First   web  </title>

<body>Hello  the  world! <body>

<html>

[root@centos6  ~]cat   sed.sh

/body/{

s/ / \ /body/2

}

[root@centos6  ~]sed    -f     sed.sh             test.sh


[root@centos6  ~]cat    test.sh

h1Helloh1

h2Helloh2

h3Helloh3

给所有第一个的h1,h2等添加<>;第二个h1,h2添加</>.

[root@centos6  ~]cat   sed.sh

/h[0-9]/{

s//\ <&\</1

s//\<\/&\</2

}

[root@centos6  ~]sed  -f  sed.sh  test.sh


"s///"命令的另一个妙处是:可以把“/”分隔符指定为其它的分隔符

sed   -e  's:/usr/local:/usr/:g'   test.txt

此时:为替换分隔符  sed会将/usr/local替换为/usr

d指令

用于删除匹配到的行,删除指令还会改变sed命令的执行循序,要删除除匹配的内容,可以使用替换。


c指令

将包含ONBOOT行的内容更改为ONBOOT=yes

sed   '/ONBOOT/c  ONBOOT=yes'      test.txt


y指令

按字符转换(tranform)语法格式为:[address]y/source-chars/dest-chars/

其中,[address]用来定位需要修改的行,source-chars为需要被修改的字符,dest-chars为准备替换的字符


将匹配到/netmask/的那一行小写转换大写

sed       '/netmask/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ '    test.txt


p指令

显示第一第二行的内容:打印(p),作用类似于l(列印),但是不显示字符,一般与-n配合使用,

sed       -n    ‘1,2p’   test.txt


l指令

列印(l)显示模式空间中的内容,显示非打印字符,一般与-n一起使用,否则会输出两次

sed   -n  ‘1,2l’   test.txt                                  

需要n屏蔽自动输出

DEVICE=eth0$

ONBOOT=YES$

  r指令

[root@centos6  ~]  cat  name.txt

Jacob

Tom

Jerry

[root@centos6  ~]  cat  mail.txt

jacob@gmial.com

tom@gmail.com

jerry@gmail.com

先读取name.txt文件内容,再读取mail.txt文件内容

[root@centos6  ~]  cat sed.sh

/.*/{

$r   mail.txt

}

[root@centos6  ~]   sed  -f   sed.sh  name.txt

Jacob

Tom

jerry

jacob@gmail.com

tom@gmail.com

jerry@gmail.com

q指令

显示  test.txt内容的前两行内容后退出sed指令

sed         ‘2q’   test.txt



Sed高级应用

sed   处理流程:

读取文档的一行至模式空间,执行相应的sed指令,完成后输出改行并清空模式空间,依次循环读入文档下一行,直至文档数据结尾


多行操作Nest(N)

通过读取新的输入行,并将它追加至模式空间的现有内容之后,来创建多行模式空间,最初内容与新输入内容\n分隔

[root@centos6  ~] cat  test.txt

name:zhangsan

mail:zhangsan@gmial.com

name:lisi

mail:lisi@gmail.com

[root@centos6  ~] sed    -n   ‘/name/N;L’           test.txt

name:zhangsan                   mail:zhangsan@gmail.com

name:lisi                             mail:lisi@gmail.com



多行操作Print(P)

多行打印P:仅输出多行模式中的第一部分,直到第一个插入的\n换行符为止。打印p打印时     \n看作是回车换行

[root@centos6  ~] cat    test.txt

aaa

bbb

ccc

ddd

eee

f f f




多行删除操作Delete(D)

多行删除D:将删除模式空间中直到第一个插入的换行符\n前的这部分,并返回sed脚本的顶端,使得剩余指令继续应于模式空间中剩余的内容

删除指令d:删除模式空间中的内容并读入新的输入行,d后面还有多条指令将不在执行,而是返回第一条指令对新读入行进行处理




保持空间Hold(h,H),Get(g,G)

模式空间是存放当前输入行的缓冲区,sed还有一个保持空间(hold  space)的缓冲区

模式空间的内容可以复制到保持空间,保持空间的内容可以复制到模式空间

Hold(h/H)                将模式空间的内容复制或追加到保持空间

Get (g/G)                    将保持空间的内容复制或追加到保持空间

Exchange(X)           交换保持空间与模式空间的内容


[root@centos6  ~] cat   test.txt

aaa

bbb

ccc

ddd

[root@centos6  ~]   sed  -e  '/aaa/h'   -e  '/aaa/d'    -e   '/ccc/G'   test.txt

bbb

ccc

aaa

ddd










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值