文本三劍客之sed用法總結

描述:

   sed是Stream EDitor(行編輯器)的簡寫,是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed 主要用來自動編輯一個或多個文件, 簡化對文件的反復操作, 編寫轉換程序等。

用法:
  sed [option]… ‘script' inputfile…

     常用選項:

    -n :不輸出模式空間內容的自動打印

示例:僅列出/etc/passwd 文件內的第5-7行

[root@localhost ~]# nl /etc/passwd |sed -n '5,7p'
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    -e:  多點編輯

示例:處理/etc/fstab 或/etc/fstab/,使用sed命令取出其基名

[root@localhost ~]# echo "/etc/fstab" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab
[root@localhost ~]# echo "/etc/fstab/" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab

    -f / PATH/TO/SCRIPT_FILE :  從指定文件中讀取編輯腳本

    -r:  支持使用擴展正則表達式

示例:處理/etc/fstab 路徑,使用sed命令取出其目錄名

[root@localhost ~]# echo "/etc/fstab/" |sed -r 's@[^/]+/?$@@'
/etc/

    -i:  原處編輯 (危險操作,不建議使用)

     script:地址命令

   (1) 不給地址:對全文進行處理

   (2) 單地址:

        #:  指定的行

       /pattern/ :被此處模式所能夠匹配到的每一行

   (3) 地址范圍:

        #,#

        #,+#

      /pat1/,/pat2/

       #,/pat1/

   (4) ~ :步進

       1~2  奇數行

       2~2  偶數行


     編輯命令:

   d:  刪除模式空間匹配的行

示例:將/etc/passwd 的內容列出并打印行號,同時刪除第2-5行

[root@localhost ~]# nl /etc/passwd |sed '2,5d'
     1root:x:0:0:root:/root:/bin/bash
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   p:  顯示模式空間中的內容

示例:將第2行打印到屏幕上

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

   a \text :在行后面追加文本;支持使用\n 實現多行追加

示例:在第2行后加上“drink tea”字樣

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

   i \text :在行前面插入文本;支持使用\n 實現多行插入

示例:在第2行前加上“drink tea”字樣

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

   c \text :替換行為單行或多行文本

示例:將第2-5行的內容替換成為“NO 2-5 number”

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

   w /path/to/somefile:  保存模式匹配的行至指定文件

示例:將第5-7行保存到/root/f1文件中

[root@localhost ~]# nl /etc/passwd |sed '5,7w/root/f1'
[root@localhost ~]# cat f1
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   r /path/from/somefile :讀取指定文件的文本至模式空間中匹配到的行后

   =:  為模式空間中的行打印行號

[root@localhost ~]# sed -n '/^$/=' /etc/issue     顯示空白行的行號
3

   !:  模式空間中匹配到的行取反處理

[root@localhost ~]# sed -n '/^$/!=' /etc/issue     除空白行以外的行顯示行號
1
2

    s/// : 查找替換, 支持使用其它分隔符,s@@@ ,s###

示例:刪除/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符

[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg 
#
# DO NOT EDIT THIS FILE
if [ -s $prefix/grubenv ]; then
load_env
fi

     v:  替換標記:

     g:  行內全局替換

     p:  顯示替換成功的行

[root@localhost ~]# sed -e's@^#@@p' /etc/fstab   顯示替換成功的行
 /etc/fstab
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Created by anaconda on Sun Aug  7 06:26

     w:  /PATH/TO/SOMEFILE :將替換成功的行保存至文件中

[root@localhost ~]# sed 's@^#@@w/root/f3' /etc/fstab    將替換成功的行保存至/root/f3文件中
[root@localhost ~]# cat f3
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Accessible filesystems, by reference, are maintained under '/dev/disk'
 See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info


       高級編輯命令:

   h:  把模式空間中的內容覆蓋至保持空間中

   H: 把模式空間中的內容追加至保持空間中

   g:  從保持空間取出數據覆蓋至模式空間

   G: 從保持空間取出內容追加至模式空間

   x:  把模式空間中的內容與保持空間中的內容進行互換

   n:  讀取匹配到的行的下一行覆蓋至模式空間

   N: 追加匹配到的行的下一行至模式空間

   d:  刪除模式空間中的行

   D: 刪除 當前模式空間開端至\n 的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

事先準備好的文件:

[root@localhost ~]# cat f1
1
2
3
4
5
6
7
8
9
10

1,sed  -n  'n;p' FILE

[root@localhost ~]# sed -n 'n;p' f1      顯示偶數行
2
4
6
8
10

2,sed   '1!G;h;$!d'  FILE

[root@localhost ~]# sed '1!G;h;$!d' f1     逆序顯示
10
9
8
7
6
5
4
3
2
1

3,sed  '$!N;$!D" f1

[root@localhost ~]# sed '$!N;$!D' f1     只顯示最后兩行
9
10

4,sed   '$!d'  FILE

[root@localhost ~]# sed '$!d' f1     只顯示最后一行
10

5,sed   ‘G’ FILE

[root@localhost ~]# sed 'G' f1     在每一行的后面添加一個空白行
1

2

3

4

5

6

7

8

9

10

6,sed   ‘g’ FILE

[root@localhost ~]# sed 'g' f1     顯示10個空白行

7,sed   ‘/^$/d;G’ FILE

[root@localhost ~]# sed '/^$/d;G' f1      顯示的效果和第5題一樣,但不同之處是:
1                              先將文件內的所有空白行刪除,然后在每一行的后面添加一個空白行
2
3

8,sed   'n;d' FILE

[root@localhost ~]# sed 'n;d' f1        顯示基數行
1
3
5
7
9

9,sed   -n '1!G;h;$p'  FILE

[root@localhost ~]# sed -n '1!G;h;$P' f1      顯示最后一行
10


總結:

1,sed工具作為文本處理三劍客中的一員,體現了其強大的功能,在處理多文件和寫腳本中的應用是很個廣泛的,需多加練習,才能靈活掌握其用法

2,以行為單位的新增/刪除功能,替換/顯示功能,‘s/要被替換的字符串/新的字符串/g'功能是經常用到的,需記憶并多加練習才能熟練掌握




原創文章,作者:pingsky,如若轉載,請注明出處:http://www.www58058.com/32121

(0)
pingskypingsky
上一篇 2016-08-10 13:58
下一篇 2016-08-10 13:59

相關推薦

  • sed講解與使用

            sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理…

    Linux干貨 2016-08-15
  • Redis應用場景

    1.  MySql+Memcached架構的問題 實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據加載到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題: 1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發…

    Linux干貨 2015-02-25
  • 為什么中國的網頁設計那么爛?

    Nick Johnson,一個有12年經驗的Web設計師在它的blog里寫下了“Why is Chinese Web Design So Bad”,新浪,人人,百度,阿里巴巴,騰訊榜上有名。其中的觀點相當的好,希望所有的中國人都讀一下。我不全文翻譯了,只是給大家看一些摘要。(保證不會像《環球時報》一樣) —————————— 作者2005年的夏天來到中國,他…

    Linux干貨 2016-07-11
  • CentOS6.8啟動卡死在開機進度條

    不知道什么原因CentOS6.8開機的時候卡在進度條一直進不去。就是下面的畫面 在這個畫面下面也看不到什么原因,果斷F5切換至有顯示開機進程的界面 看到了上述的錯誤提示:invalid user :'root' root是無效的root這是什么鬼? 接下來重新開機,進入到救援模式 開機的時候快速按一下ESC,進入到CD啟動,然后選擇救援模…

    Linux干貨 2016-12-08
  • 如何理解云計算中IaaS、PaaS和SaaS?很簡單,就像吃貨想吃披薩了…

                                                      &nbsp…

    2015-04-17
  • Linux進程篇16.3ps命令:進程管理工具

    ps命令:進程管理工具

    Linux干貨 2017-12-18
欧美性久久久久