sed命令應用詳解

sed應用詳解

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

 用法:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

sed可依照script來處理文本文件,skript又包含地址定界和編輯命令。地址定界是指定要處理的文件范圍,比如只處理文件的前十行內容,或者只處理文件的奇數行等,編輯命令是指對指定范圍的內容進行怎樣的處理,比如在屏幕上打印顯示,或者刪除、替換等操作,地址定界和編輯命令必須配合使用,如果不指定地址定界則默認對全文進行處理。sed本身也有選項參數,常用的選項參數如下所示:

-n:僅顯示經過script處理后的結果,默認情況下,sed會自動打印模式空間的內容

-e:可以指定多個script同時處理

-f /path/to/script_file:從指定的文件中讀取腳本并運行

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

-i:直接修改源文件

script地址定界的方式有:

(1)若不指定范圍則表示處理全文

(2)#:#代表數字,指定行號

(3)/pattern/:模式匹配,被/pattern/匹配到的所有行

(4)#1,#2:表示從第#1行到第#2行之間所有的行

(5)#,+n:表示從第#行開始再向下n行之間的所有行

(6)/pat1/,/pat2/:表示從第一次被/pat1/匹配到的行開始,到第一次被/pat2/匹配到的行結束,中間所有的行

(7)#,/pat1/:表示從第#行開始,到第一次被/pat1/匹配到的行結束,之間所有的行

(8)first~step:表示指定起始行以及步長,比如1~2,1代表起始行,2代表步長,匹配到的行即為1,3,5,7…(奇數行)

(9)$:表示最后一行

script編輯命令有:

d:刪除模式空間中的行

[root@fengl testdir]# cat test     #先查看test原文件內容
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1d' test   #刪除第1行
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

p:打印模式空間中的行

[root@fengl testdir]# sed -n '/aaa/p' test     #只打印匹配“aaa”的行
1aaaaaaaaaaaaaaaa

a \text:在當前行下面追加文本,支持使用\n實現多行追加

[root@fengl testdir]# sed '1,3a\ggggggggg' test   #在1至3行下面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

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

[root@fengl testdir]# sed '2,+2i\ggggggggg' test      #在從第2行開始向下2行的上面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

c \text:把選定的行改為新的文本

[root@fengl testdir]# sed '/a/,/c/c\ggggggggg' test    #將第一次匹配到的‘a’所在行至‘c’所在行之間的所有內容更改為“ggggggggg”
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

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

[root@fengl testdir]# sed -n '3,/f/=' test  #只顯示從第3行開始到第一次匹配到“f”所在行之間的所有行的行號
3
4
5
6

s/regexp/replacement/:查找替換,替換由regexp所匹配到的內容為replacement,支持使用其他分隔符,條件是該分隔符在后面的模式中沒有出現過,如s@@@或s###,對于替換還有后選項,如下:

    g:全局替換

    p:顯示替換成功的行

    i:不區分大小寫

[root@fengl testdir]# sed '1~2s/e/g/' test  #將奇數行中匹配到的第一個“e”替換成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5geeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1~2s/e/g/g' test #將奇數行中所有匹配到的“e”替換成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5gggggggggggggggg
6ffffffffffffffff
[root@fengl testdir]# sed -n '1~2s/e/g/p' test   #將奇數行中所有匹配到的“e”替換成“g”,并只顯示替換的行
5geeeeeeeeeeeeeee

w/path/to/somefile:把指定的內容另存至/path/to/somefile路徑所指定的文件中

[root@fengl testdir]# sed -n '1,4w/testdir/testsave' test    #將test文件中的1至4行內容另存到/testdir/目錄下的testsave文件中
[root@fengl testdir]# cat testsave    #查看testsave文件
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd

r/path/form/somefile:在文件的指定位置插入另一個文件的所有內容,完成文件合并

[root@fengl testdir]# sed '3r/testdir/text' test   #將/testdir/text文件中的內容插入到test文件的第3行下面
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
hhhhhhhhhhhhh
iiiiiiiiiiiii
jjjjjjjjjjjjj
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

sed除了“模式空間”(pattern space)外,還有一個保持空間“hold space”。sed工作機制是每次讀取一行文本至模式空間中, 在模式空間中完成處理,將處理結果輸出值標準輸出設備,在模式空間中處理一行內容后悔繼續處理下一行,那么對于處理過的行可能還有其他的處理,因此可以先把處理過的行“傳送”至保持空間中,然后在后續的處理中再次“傳送”回模式空間中。

sed工具支持一些高級的命令運用到保持空間中,這些高級命令有:

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

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

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

G:從保持空間中取出數據追加至模式空間

x:交換保持空間和模式空間的內容

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

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

d:刪除模式空間中的內容

D:刪除多行模式空間中的首行

注意:

!:取反,表示后面的命令對所有沒有被選定的行發生作用

;:分號可用于分割腳本

示例1:

[root@fengl testdir]# sed -n 'n;p' test
2bbbbbbbbbbbbbbbb
4dddddddddddddddd
6ffffffffffffffff

sed的處理步驟為:

(1)因為n表示讀取匹配到的行的下一行到模式空間中,因此第一次讀取第1行時的動作是將第2行的內容覆蓋至模式空間中,此時模式空間中的內容是第2行內容

(2)緊接著執行p操作,即打印模式空間的行(打印第2行內容)

(3)然后重復執行以上操作,繼續讀取下一行(即第3行,因為第2行已經讀取過了),并將其下一行覆蓋至模式空間(即模式空間的內容是第4行內容),然后再執行p操作(打印第4行內容),依次類推,直至文件讀取完畢后結束sed運行

實例2:

[root@fengl testdir]# sed '1!G;h;$!d' test
6ffffffffffffffff
5eeeeeeeeeeeeeeee
4dddddddddddddddd
3cccccccccccccccc
2bbbbbbbbbbbbbbbb
1aaaaaaaaaaaaaaaa

sed的處理步驟為:

(1)讀取文件的第一行內容到模式空間,因為第一行不執行G操作

(2)執行h操作,將模式空間的內容覆蓋至保持空間

(3)因為不是最后一行,因此執行d操作,刪錯模式空間中的內容。此時模式空間內容為空,保持空間為第一行內容

(4)緊接著執行第2次循環,讀取第2行內容,并執行G操作,將保持空間的內容追加至模式空間。此時模式空間為第2行和第1行內容,保持空間為第1行內容

(5)繼續執行h操作,再把模式空間的內容覆蓋至保持空間,因為第2行不是最后一行,然后在執行d操作,刪除模式空間的內容。此時模式空間為空,保持空間為第2行和第1行內容(第1行內容在第2行下面)

(6)依次循環至文件最后一行,不執行d操作,此時模式空間的第1行內容為源文件的最后一行內容(行倒序排序),最后打印出模式空間的內容。

原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/32621

(0)
苦澀咖啡苦澀咖啡
上一篇 2016-08-11
下一篇 2016-08-11

相關推薦

  • 自建回收站

    linux 自添加回收站 (1)建立一個回收站目錄 mkdir /tmp/trash_tmp (2) 編輯一個文件 vi /bin/trash mv $@ /tmp/trash_tmp :wq 保存退出 (3)添加別名 alias rm=/bin/trash (4)編輯/etc/bashrc 在最后一行添加alias rm=/bin/trash (5)給予目…

    Linux干貨 2017-09-04
  • First Day

    learning

    2018-03-26
  • grep命令與正則表達式

    grep命令與正則表達式 什么是grep:         grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。Unix的…

    Linux干貨 2017-04-08
  • inode、軟硬鏈接區分、ln命令

    inode、軟硬鏈接區分、ln命令 一、inode inode記錄的是文件的屬性及文件實際放在那塊數據塊中的。inode包含以下數據: 1. 該文件的可被訪問的權限(read/write/excute) 2. 該文件的屬主、屬組(owner、group) 3. 該文件的大小 4. 該文件創建或者狀態改變的時間(Ctim…

    Linux干貨 2016-08-02
  • CentOS系統啟動流程——深入了解linux

    CentOS系統啟動流程 ·Linux系統的組成部分:內核+根文件系統      內核:進程管理、內存管理、網絡協議棧、文件系統、驅動程序、安全功能              IPC:Inter Pr…

    Linux干貨 2016-09-11
  • 在centos6.9上實現軟RAID

    在centos6.9上實現軟RAID 什么是RAID?     RAID,全稱Redundant Arrays of Inexpensive(Independent)Disks。簡單翻譯叫磁盤陣列。    通俗一點講就是多個磁盤合成一個“陣列”來提供更好的性能、冗余,或者兩者都提…

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