linux文本处理三剑客之sed

         上一节我们已经学习过了grep,今天来学习sed。它是按照script的指令,来处理,编辑一个或多个文本文件,简化对文件的反复操作,编写转换程序等。

sed用法

sed             选项            动作           输入文件

参数说明

-n               不输出到屏幕,不打印(默认打印)

-e               多点编辑输入的文本文件

-f                以选项中指定的script文件来处理输入的文本文件

-r                扩展正则表达式

-h               显示帮助

-v               显示版本信息

-i               sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

实例:

-n

[root@localhost ~]# seq 1 10 |sed -n '8p'
8
[root@localhost ~]# seq 1 10 |sed -n "$[$(seq 1 10|wc -l)-1]p"
9   #输出倒数第二行

-e:

[root@localhost ~]# sed -e  2a\desk e
how are you?
apple banana apple
desk
wine  tea  juice
desk  chair  

-r:

[root@localhost app]# cat /etc/passwd |sed -r 's/(r..t).*\1/hello/g'
hello:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

动作说明

a               新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c               取代      把指定行内容替换

d               删除      把指定行删除

i                插入      i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p               打印      亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

s               取代      可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!

=               打印行号

nl              显行号

1.以行为单位的新增/删除

将 /etc/passwd 的内容复制到/app目录下,列出并且列印行号。

-a  在第二行后(亦即是加在第三行)加上drink tea字样!

[root@localhost app]# nl /etc/passwd | sed '2a drink tea'
      1    root:x:0:0:root:/root:/bin/bash
      2    bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
      3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
      4    adm:x:3:4:adm:/var/adm:/sbin/nologin
      5    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

-i  那如果是要在第二行前

[root@localhost app]# nl /etc/passwd | sed '2i drink tea'
      1    root:x:0:0:root:/root:/bin/bash
drink tea
      2    bin:x:1:1:bin:/bin:/sbin/nologin
      3    daemon:x:2:2:daemon:/sbin:/sbin/nologin

-d  第 2~5 行删除!

[root@localhost app]# nl /etc/passwd |sed '2,5d'
      1    root:x:0:0:root:/root:/bin/bash
      6    sync:x:5:0:sync:/sbin:/bin/sync
      7    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      8    halt:x:7:0:halt:/sbin:/sbin/halt
      9    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
     10    operator:x:11:0:operator:/root:/sbin/nologin
     11    games:x:12:100:games:/usr/games:/sbin/nologin

sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔

2.以行为单位的替换与显示

-c  将第2-5行的内容取代成为『No 2-5 number』呢?

[root@localhost app]# nl /etc/passwd | sed '2,5c No 2-5 number'
      1    root:x:0:0:root:/root:/bin/bash
No 2-5 number
      6    sync:x:5:0:sync:/sbin:/bin/sync
      7    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

3.数据的搜寻并显示

搜索 /etc/passwd有root关键字的行

[root@localhost app]# nl /etc/passwd | sed -n '/root/p'
      1    root:x:0:0:root:/root:/bin/bash
     10    operator:x:11:0:operator:/root:/sbin/nologin

4.数据的搜寻并替换

   除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'
[root@localhost app]# ifconfig ens33|sed -n '2p'|sed 's/^.*inet//g'|sed 's/net.*$//g'
  172.18.254.169 

5.多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell。-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell

[root@localhost app]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
      1    root:x:0:0:root:/root:/bin/blueshell
      2    bin:x:1:1:bin:/bin:/sbin/nologin

6.地址定界:

     (1) 不给地址:对全文进行处理
     (2) 单地址:
          #: 指定的行,$:最后一行
          /pattern/:被此处模式所能够匹配到的每一行
     (3) 地址范围:
          #,#
         #,+#
         /pat1/,/pat2/
         #,/pat1/
     (4) ~:步进
     1~2 奇数行
     2~2 偶数行

高级用法

h                模式空间覆盖至保持空间

H               模式空间追加至保持空间

g                保持空间覆盖至模式空间

G               保持空间追加至模式空间

x                保持空间和模式空间内容互换

n                行的下一行覆盖至模式空间

N               行的下一行追加至模式空间

D               保留最后一行

d                删除模式空间行

例子:

(1)输出偶数行

[root@localhost ~]# seq 1 8 |sed -n 'n;p' 
2
4
6
8

(2)只显示奇数行

[root@localhost ~]# seq 1 10 |sed 'n;d' 
1
3
5
7
9

(3)倒序输出

[root@localhost ~]# seq 1 10 |sed -n '1!G;h;$p'
10
9
8
7
6
5
4
3
2
1

(4)输出倒数后两行

[root@localhost ~]# seq 1 10 |sed '$!N;$!D'
9
10

(5)空行删除,每行后加一个空行,即保证每行后只有一个空行

[root@localhost ~]# cat seq.txt |sed '/^$/d;G' 
1
2
3
4
5
6

猜你喜欢

转载自www.cnblogs.com/f-h-j-11-7/p/9383169.html