行編輯器sed的應用

sed

sed:Stream EDitor,行編輯器

sed是一種流編輯器,它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區中,

稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,

把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒

有改變,除非你使用重定向存儲輸出。

sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等

選項:

-n:不輸出模式空間中的內容至屏幕;理解為僅顯示處理過的結果,禁用默認輸出

-e:多點編輯

-f /path/to/script_file:從指定文件中讀取編輯腳本

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

-i:直接編輯原文件

sed使用格式為地址命令

地址定界:

  1. 不給定任何地址或空地址,對全文進行處理

  2. 單地址;

       #:指定地#行

     pattern:被此模式模式所匹配的每一行

3.地址范圍:

#,#:起始行到結束行

#,+#:例如3,+8==>從第3行開始,向下8行,包含第3行,共計9行

#,/pattern/:從第#行開始,到第一次能夠被模式匹配的行結束

/pattern1/,/pattern2/:從第一次能夠被模式1匹配的行開始,到第一個能夠被模式2所匹配的行結束

/是固定的模式符號,必須要帶

4.~:步進

1~2奇數行

2~2:偶數行

編輯命令:

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

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

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

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

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

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

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

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

?。耗J娇臻g中匹配行取反處理,條件取反,   (取反!要放在命令之前)例如“!d”

                                           地址定界!編輯命令==>!位置

命令應用實例操作

[root@localhost ~]# cat test
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# sed '1,5d'  test
6       
7                                    ===>1,5為地址表示從第一行到第五行,d命令是刪除匹配的行
8                                        所以,結果是只顯示文件的6到10行
9
10
[root@localhost ~]#
[root@localhost ~]# sed '1,5p'  test
1
1                             ===>因為模式空間中的內容默認會顯示,p命令顯示模式空間匹配的內容
2                                 模式空間匹配的是1至5行,默認會顯示1至10行,所以最終顯示如下結果                     
3                                 
3                                 
4
4
5
5
6
7
8
9
10
[root@localhost ~]# sed -n '1,5p'  test
1
2                               ===>-n選項不輸出模式空間中的內容至屏幕,相當于禁用了默認顯示的功能,
3                                    所以只顯示了p命令匹配的1至5行
4
5
[root@localhost ~]#
[root@localhost ~]# sed '1 a\newline' file    ==>在第一行后面追加文本newline
1
newline
2
3
4
5
[root@localhost ~]# sed '1 i\newline' file   ==>在第一行前面插入文本newline
newline
1
2
3
4
5
[root@localhost ~]# sed '1 c\newline' file   ==>第一行替換為文本newline
2
3
4
5
[root@localhost ~]# sed '2,4 w a' file  ==>將第二行到第四行的內容保存至a文件中
1
2
3
4
5
[root@localhost ~]# cat a              ==>a文件內容為file文件第二到第四行
2
3
4
[root@localhost ~]# sed '2r A' file     ==>將A文件內容讀取至第二行后面
1
2
ahhahahah
3
4
5
[root@localhost ~]# cat A         
ahhahahah

sed工具

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

替換標記:

  g:行內全局替換

  p:顯示替換成功的行

  w  /path/to/somefile:將替換的行保存至文件中

看下sed實例

1.sed ‘2p’ /etc/passwd

第二行顯示兩邊,其他行默認顯示,太長了就沒全顯示出來了 

blob.png

2.sed –n ‘2p’ /etc/passwd

因為-n選項禁用了模式空間默認輸出至屏幕的功能,所以只顯示了第二行

blob.png

3.sed –n ‘1,4p’ /etc/passwd

和上面以上,所以只顯示1至4行

blob.png

4.sed –n ‘/root/p’ /etc/passwd

只顯示包含root的行;

blob.png

5.sed –n ‘2,/root/p’ /etc/passwd  從2 行開始

顯示從第二行開始,到第一個匹配到root的行結束之間的行

備注:/root/要從第二行后開始匹配

blob.png

6.sed -n ‘/^$/=’ file  顯示空行行號

blob.png

7.sed –n –e ‘/^$/p’ –e ‘/^$/=’ file

僅顯示空行和其行號

blob.png

8.sed ‘/root/a\superman’ /etc/passwd 行后

在能夠匹配到root的行后面追加superman

blob.png

9.sed ‘/root/i\superman’ /etc/passwd  行前

在能夠匹配到root的行前插入Superman

blob.png

10.sed ‘/root/c\superman’ /etc/passwd 

把能夠匹配到root的替換成superman

blob.png

11.sed ‘/^$/d’ file

刪除空行

blob.png

12.sed ‘1,10d’ file

刪除1到10行,因為總共才7行,刪光了還不夠,所以上面都不顯示

blob.png

13.nl /etc/passwd | sed ‘2,5d’

刪除了第2到5行

blob.png

14.nl /etc/passwd | sed ‘2a\tea’

在第二行后面追加tea

blob.png

15.sed 's/test/mytest/g' example

將test替換成mytest,g表示全局替換

blob.png

16.sed –n‘s/root/&superman/p’ /etc/passwd  單詞后

將root替換成rootsuperman,并只顯示匹配到root的行

備注:&代表前面匹配到的root

blob.png

17.sed –n‘s/root/superman&/p’ /etc/passwd  單詞前

將root替換成supermanroot,并只顯示匹配到root的行

備注:&代表前面匹配到的root

blob.png

18.sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets

將dog替換成cat,將hi替換成lo,因為-e選項是可以多點編輯的,意思是可以同時編輯多個

blob.png

19.sed –i.bak ‘s/dog/cat/g’ pets

-加上i選項會修改原文件,安全起見,備份原文件為pets.bak

blob.png

高級編輯命令:

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

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

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

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

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

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

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

d:刪除模式空間中的行

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

還是看看實例好了

  1. sed -n 'n;p' FILE

顯示偶數行

理解:讀取第一行時,第二行覆蓋至模式空間,并顯示,然后讀取第三行,

      下一行第四行覆蓋至模式空間,并顯示,如此類推

blob.png

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

逆序顯示===>所有的命令都是針對模式空間

說明:讀取第一行時,1命令不處理,將第一行內容覆蓋至保存空間,將模式空間中的第一行刪除

      讀取第二行時,將保存空間的內容追加至模式空間,此時模式空間里面有第二行第一行,

      然后將此時模式空間的內容覆蓋至保存空間,然后刪掉模式空間的第二一行

      讀取第三行時,將保存空間的內容追加至模式空間,此時模式空間里面有第三行第二行第一行,

      然后此時模式空間的內容覆蓋至保存空間,然后刪掉模式空間的第三二一行

      讀取第四(最后)行時,將保存空間的內容追加至模式空間,此時模式空間里面有第四行第三行第二行第一行,

      然后此時模式空間的內容覆蓋至保存空間,最后一個命令不處理,模式空間顯示內容為第四三二一行

blob.png

3. sed '$!N;$!D' FILE

顯示倒數兩行

說明:

讀取第一行時,將第二行追加至模式空間,然后刪除

讀取第三行時,將第四行追加至模式空間,然后刪除

讀取第五行時,將第六(最后)行追加至模式空間,然后顯示

blob.png

4.sed '$!d' FILE

顯示最后一行

說明:

讀取第一行時,刪除

讀取第二行時,刪除

讀取第三行時,刪除

讀取第四行時,刪除

讀取第五行時,刪除

讀取第六(最后)行時,顯示

blob.png

5. sed ‘G’ FILE

在每一行后面追加空行

說明:

讀取第一行時,將保持空間中的空行追加至模式空間,然后顯示

讀取第二行時,將保持空間中的空行追加至模式空間,然后顯示

讀取第三行時,將保持空間中的空行追加至模式空間,然后顯示

讀取第四行時,將保持空間中的空行追加至模式空間,然后顯示

讀取第五行時,將保持空間中的空行追加至模式空間,然后顯示

讀取第六行時,將保持空間中的空行追加至模式空間,然后顯示

blob.png

6.sed ‘g’ FILE

將每一行替換成空行

說明:

讀取第一行時,將保持空間中的空行覆蓋至模式空間,然后顯示

讀取第二行時,將保持空間中的空行覆蓋至模式空間,然后顯示

讀取第三行時,將保持空間中的空行覆蓋至模式空間,然后顯示

讀取第四行時,將保持空間中的空行覆蓋至模式空間,然后顯示

讀取第五行時,將保持空間中的空行覆蓋至模式空間,然后顯示

讀取第六行時,將保持空間中的空行覆蓋至模式空間,然后顯示

blob.png

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

沒搞明白,待研究

blob.png

8.sed 'n;d' FILE

顯示奇數行

說明:

讀取第一行時,第二行覆蓋至模式空間,然后刪除

讀取第三行時,第四行覆蓋至模式空間,然后刪除

讀取第五行時,第六行覆蓋至模式空間,然后刪除

blob.png

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

逆序顯示

說明:

讀取第一行時,1命令不處理,將第一行內容覆蓋至保存空間,將模式空間中的第一行不顯示

讀取第二行時,將保存空間的內容追加至模式空間,此時模式空間里面有第二行第一行,

然后將此時模式空間的內容覆蓋至保存空間,然后模式空間的第二一行不顯示

讀取第三行時,將保存空間的內容追加至模式空間,此時模式空間里面有第三行第二行第一行,

然后此時模式空間的內容覆蓋至保存空間,然后模式空間的第三二一行不顯示

讀取第四(最后)行時,將保存空間的內容追加至模式空間,此時模式空間里面有第四行第三行第二行第一行,

然后此時模式空間的內容覆蓋至保存空間,最后一行,模式空間顯示內容為第四三二一行

blob.png

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

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

相關推薦

  • Linus:利用二級指針刪除單向鏈表

    感謝網友full_of_bull投遞此文(注:此文最初發表在這個這里,我對原文后半段修改了許多,并加入了插圖) Linus大嬸在slashdot上回答一些編程愛好者的提問,其中一個人問他什么樣的代碼是他所喜好的,大嬸表述了自己一些觀點之后,舉了一個指針的例子,解釋了什么才是core low-level coding。 下面是Linus的教學原文及翻譯—— “…

    Linux干貨 2016-07-10
  • 馬哥教育網絡20期+第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; :%s/^[[:space:]]/#&/ 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白…

    Linux干貨 2016-07-07
  • 網絡班N_27第三周作業

    1、   列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who |cut-d” ” -f1 | sort -u 2、   取出左后登錄到當前系統的用戶的相關信息。 [root@localhost ~]# id `l…

    2017-08-11
  • N21—-第一周課程練習題

    1、描述計算機的組成及其功能。 我們現在通常理解為計算機是由硬件系統+軟件系統組成的,根據馮·諾依曼體系結構。計算機主要由五大部件組成:      運算器(Datapath): 計算機中執行各種算術和邏輯運算操作的部件      控制器(Control):是整個計算機的中樞神經,…

    Linux干貨 2016-07-12
  • haproxy負載均衡兩個后端httpd和mysql

    前端主機:172.16.71.1,后端主機:172.16.71.4和172.16.71.5 前端主機安裝haproxy yum install haproxyvim /etc/haproxy/haproxy.cfgglobal    log         127.0.0.1 local2 &nbs…

    Linux干貨 2017-02-12
  • awk用法三

      6、結構化控制語句     6.1 if語句       格式:if(條件) {body} else {else body}         實例1:判斷/etc/passwd文件中的UID如果大于500則顯示為“common user”,否則顯…

    Linux干貨 2016-02-14
欧美性久久久久