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打印 偶数行 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342