1. 程式人生 > >linux文本處理三劍客之sed

linux文本處理三劍客之sed

編輯命令 color 註意 正則表達 搜索 sed 保持空間 則表達式 lin

上一節我們已經學習過了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

linux文本處理三劍客之sed