sed 命令用法与实例

语法  sed     '范围(条件)  命令'       file

                d: 删除

                  范围: 使用数字 表示多少行, 可以使用逗号表示到。 ~表示跨步

                             $ 表示最后一行

                              [root@hadoop000 ~]#  cat  -n  /etc/passwd | sed '10.35d’


                              正则表达式: // 引起来

 [root@hadoop000 ~]# cat  aa

to

tom aaa bbbtomaaa

111 tom aaaTom cccc

aaaatomaaaaaa

aaaaaaaaaaaaaaaaaatom

                             [root@hadoop000 ~]# sed '/tom/d' aa        ##删除tom行

                               to

                              [root@hadoop000 ~]# sed '/^tom/,/tom$/d' aa   ##删除tom行

                               to

                               [root@hadoop000 ~]# sed '/\btom\b/d' aa        ###删除tom单词行      

                               to

                               aaaatomaaaaaa

                               aaaaaaaaaaaaaaaaaatom

                     s : 替换  s/old/new/标签      意思是把old换成new

                                            old是可以使用正则的,但是new的位置不能使用正则

                                                   & 表示old的值

                                                    \U 把\U后面所有的字符全部转变为大写

                                                     \u 把\u后面第一个字符变成大写

                                                     \L  把后面所有的字符变成小写

                                                     \l  把后面第一个字符变成小写

                                                     \E  代表是终止

                         [root@hadoop000 ~]# sed 's/tom/TOM/' aa   ###这样只替换每行的第一个tom 

                          to

                          TOM aaa bbbtomaaa

                          111 TOM aaaTom cccc

                           aaaaTOMaaaaaa

                          aaaaaaaaaaaaaaaaaaTOM

                           [root@hadoop000 ~]# sed 's/tom/TOM/g' aa  ###加上标签g 把第一个tom也替换掉了

                           to

                           TOM aaa bbbTOMaaa

                           111 TOM aaaTom cccc

                           aaaaTOMaaaaaa

                           aaaaaaaaaaaaaaaaaaTOM

                            [root@hadoop000 ~]# sed 's/[tT][Oo]m/TOM/g' aa   ###不管是大小写t与大小写o都替换

                             to

                             TOM aaa bbbTOMaaa

                             111 TOM aaaTOM cccc

                              aaaaTOMaaaaaa

                              aaaaaaaaaaaaaaaaaaTOM

                            [root@hadoop000 ~]# cat  bb

                            TOM TOM TOM AAA AAA AAA

                            aaa

                            [root@hadoop000 ~]# sed '1{s/tom/TOM/g; s/aaa/AAA/g}' bb  ###指定第一行替换多个  

                            TOM TOM TOM AAA AAA AAA

                            aaa

                           [root@hadoop000 ~]# sed 's/tom/--&--/g' aa   ##这里的&相当于old

                           to

                          --tom-- aaa bbb--tom--aaa

                         111 --tom-- aaaTom cccc

                         aaaa--tom--aaaaaa

                         aaaaaaaaaaaaaaaaaa--tom--


             [root@hadoop000 ~]# cat  aa

             to

             tom aaa bbbtomaaa

             111 tom aaaTom cccc

             aaaatomaaaaaa

             aaaaaaaaaaaaaaaaaatom

             [root@hadoop000 ~]# sed 's/tom/yyy\Uyyy/g' aa                  \U 把\U后面所有的字符全部转变为大写

              to

              yyyYYY aaa bbbyyyYYYaaa

              111 yyyYYY aaaTom cccc

              aaaayyyYYYaaaaaa

              aaaaaaaaaaaaaaaaaayyyYYY

              [root@hadoop000 ~]# sed  's/tom/y\uyyy/g' aa           \u 把\u后面第一个字符变成大写

               to

               yYyy aaa bbbyYyyaaa

               111 yYyy aaaTom cccc

               aaaayYyyaaaaaa

                aaaaaaaaaaaaaaaaaayYyy


              [root@hadoop000 ~]# sed  's/tom/T\LTTTT/g' aa            \L  把后面所以的字符变成小写

               to

               Ttttt aaa bbbTttttaaa

               111 Ttttt aaaTom cccc

               aaaaTttttaaaaaa

               aaaaaaaaaaaaaaaaaaTtttt

             [root@hadoop000 ~]# more  aa

              to

               tom aaa bbbtomaaa

               111 tom aaaTom cccc

                aaaatomaaaaaa

                 aaaaaaaaaaaaaaaaaatom

                [root@hadoop000 ~]# sed  's/tom/T\lTTTT/g' aa        \l  把后面第一个字符变成小写

                to

               TtTTT aaa bbbTtTTTaaa

               111 TtTTT aaaTom cccc

                aaaaTtTTTaaaaaa

               aaaaaaaaaaaaaaaaaaTtTTT                              

          [root@hadoop000 ~]# more smb.conf  要求把[]里面小心的字符换成大小的

          [public]

          public = yes

          [liyong]

          writable = yes

        [root@hadoop000 ~]# sed 's/\[.*]/\U&/' smb.conf  

        [PUBLIC]

        public = yes

        [LIYONG]

        writable = yes


                    [root@hadoop000 ~]# sed 's/tom/yyy\Uyyy\Ey/g' aa      \E  代表是终止

                    to

                   yyyYYYy aaa bbbyyyYYYyaaa

                  111 yyyYYYy aaaTom cccc

                  aaaayyyYYYyaaaaaa

                  aaaaaaaaaaaaaaaaaayyyYYYy     


      分组(group) : 在old部分相关位置使用()扩起来,在new可以引用。第一括号使用\1  \2

 [root@hadoop000 conf]# sed  -n  's/#\(ServerName\)/\1/p' /etc/httpd/conf/httpd.conf    

ServerNamewww.example.com:80

[root@hadoop000 conf]# sed  -n  's/#\(Server\)\(Name\)/\2/p' /etc/httpd/conf/httpd.conf

Namewww.example.com:80

 a : 在指定行的下一行添加一行

  i  :   在指定行的上一行添加

  c :   替换 ---> 把满足某个条件的行替换

  y :  替换 

注意: 如果想使用sed修改源文件的话,那么不要使用-n选项和p标签

 [root@hadoop000 ~]# cat  ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=192.168.192.251

NETMASK=255.255.255.0

GATEWAY=192.168.192.2

[root@hadoop000 ~]# sed '2a DNS1=192.168.30.1' ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

DNS1=192.168.30.1

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=192.168.192.251

NETMASK=255.255.255.0

GATEWAY=192.168.192.2

[root@hadoop000 ~]# sed '/^ONBOOT/c ONBOOT=no' ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=no

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=192.168.192.251

NETMASK=255.255.255.0

GATEWAY=192.168.192.2

[root@hadoop000 ~]# sed '2y/abc/XYZ/' aa   

to

tom XXX YYYtomXXX

111 tom aaaTom cccc

aaaatomaaaaaa

aaaaaaaaaaaaaaaaaatom

#######sed 老段下######

记住: 我们所做的所以的操作,并没有改变源文件

     = 

     n  读取下一行

     N  追加 也是读取下一行

#n 读取下一行之后,会覆盖模式空间的内容

[root@hadoop000 ~]# sed -n  '1{n;p}' ifcfg-eth0  

TYPE=Ethernet

[root@hadoop000 ~]# sed -n  '1{N;p}' ifcfg-eth0  

DEVICE=eth0

TYPE=Ethernet

保持空间

   x: 让 保持空间和模式空间的数据互换

   h:    把模式空间的内容拷贝到保持空间(覆盖)

   H:    把模式空间的内容拷贝保持空间(追加)

   g:    把保持空间的内容写入到模式空间(覆盖)

   G: 把保持空间的内容写入到模式空间(追加)

使用sed标签功能,可以让我们实现循环

语法:

           sed ':标签 范围1  命令1;  /模式/b 标签名'  file 

[root@hadoop000 ~]# more  dd

rhce aaa rhce rhce

rhce aaa rhce rhce

rhce aaa rhce rhce

rhce aaa rhce rhce

rhce aaa rhce rhce

[root@hadoop000 ~]# sed ':XX s/rhce/RHCE/; /rhce/b XX' dd

RHCE aaa RHCE RHCE

RHCE aaa RHCE RHCE

RHCE aaa RHCE RHCE

RHCE aaa RHCE RHCE

RHCE aaa RHCE RHCE 

[root@hadoop000 ~]# more cc

tom

jingli

bob

zongjian

mary

jingli

jerry

zongjian

[root@hadoop000 ~]# sed -n   -e 'x;n' -e  '/jingli/{x;p}' cc

tom

mary

[root@hadoop000 ~]# sed -n   -e  '/jingli/!h' -e '/jingli/{x;p}' cc        

tom

mary

[root@hadoop000 ~]# sed -n   -e  '/jingli/!h' -e '/jingli/{H;x;p}' cc

tom

jingli

mary

jingli

[root@hadoop000 ~]# sed -n   -e  '/jingli/!h' -e '/jingli/{H;x;s/\n/:/;p}' cc      

tom:jingli

mary:jingli

要求:职位和用户互换位置

[root@hadoop000 ~]# more cc

tom

jingli

bob

zongjian

mary

jingli

jerry

zongjian

[root@hadoop000 ~]# sed -n  'h;n;G;s/\n/:/;p' cc          ## G: 把保持空间的内容写入到模式空间(追加)

jingli:tom

zongjian:bob

jingli:mary

zongjian:jerry

要求:想把所有的用户名全部打印出来

[root@hadoop000 ~]# more  cc

tom

jingli

bob

zongjian

mary

jingli

jerry

zongjian

[root@hadoop000 ~]# sed -n  'h;n;g;p' cc

tom

bob

mary

jerry


例题: sed打印基数行 与偶数行 

[root@hadoop000 ~]# seq 10 |sed 'n;d'             ###n  读取下一行  d 删除

1

3

5

7

9

[root@hadoop000 ~]# seq 10 |sed -n '1~2p'

1

3

5

7

9

[root@hadoop000 ~]# seq 10 |sed -n 'p;n'

1

3

5

7

9

[root@hadoop000 ~]# seq 10 |sed  '2~2d'  

1

3

5

7

9

[root@hadoop000 ~]# seq 10 |sed  'p;N;d'

1

3

5

7

9

[root@hadoop000 ~]# seq  10 |sed 'N;s/\n/ /'

1 2

3 4

5 6

7 8

9 10

例题: sed打印 偶数行 

你可能感兴趣的:(sed 命令用法与实例)