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 09:37
下一篇 2016-08-11 09:37

相關推薦

  • vsftp通過pam_mysql做虛擬用戶認證

    vsftpd可以通過三種賬戶登錄系統: 系統賬戶:系統本地賬戶登錄系統,默認進入的目錄是用戶家目錄,可以在所有有權限的路徑切換; 匿名賬戶:匿名用戶登錄,然后映射為一個本地用戶; 虛擬賬戶:既不是系統本地用戶也不是匿名用戶,而是通過pam做第三方認證的方法,支持文件和數據庫,ldap的認證,此處通過mysql進行實驗; 一、準備實驗環境 實驗在一臺虛擬機上進…

    Linux干貨 2017-06-07
  • haproxy 動靜分離負載均衡、?stats頁面實現?。

    實驗環境:一臺主機提供haproxy、nfs、mariadb,后端2臺apache部署wordpress。 實驗目的:haproxy使得動靜分離、以及開啟stats頁面。 haproxy簡單介紹 負載均衡的解決方案,支持4、7層,特點是單進程模型(可配置為多進程模型)單進程能支持非常大的并發鏈接數量(相比較其他軟件)。 到今天,馬哥課程中的負載均衡方案(lv…

    Linux干貨 2017-02-18
  • N25第六周作業

    vim編輯器 基本模式: 編輯模式,命令模式 輸入模式 末行模式: 內置的命令行接口;   打開文件: # vim [options] [file ..] +#:打開文件后,直接讓光標處于第#行的行首; +/PATTERN:打開文件后,直接讓光標處于第一個被PATTERN匹配到的行的行首;   模式轉換: 編輯模式:默認模式 編輯模式 &…

    Linux干貨 2017-02-15
  • 第五周:grep和find的使用練習

    1、顯示當前系統上root、fedora或user1用戶的默認shell; grep -E "^(root|fedora|user1)" /etc/passwd | cut -d: -f7 grep -E "^root|fedora|use…

    Linux干貨 2016-10-25
  • nmcli命令使用,解析性能監控工具

    nmcli nmcli地址配置工具,NetworkManager client 網絡管理客戶端 相關命令:nmcli connection show        查看當前連接狀態 nmcli connection reload      重啟服務 nmcli connection sho…

    Linux干貨 2016-09-07
  • 命令,Linux的獨特魅力

    轉眼又學了一個星期,那就來分享一下這個星期所學的知識吧! 這個星期學的都是各種命令,而這些命令就如同windoes里面畫面上的各種選項,沒有這些命令,那么你對它將無從下手。那下面就來看看這些命令的強大功能 help   man help(內部命令幫助),等同于man(外部命令幫助)。當你對一個命令不熟悉時,這兩個命令將是你的救命符 選定一個命令,先…

    2017-07-22
欧美性久久久久