Linux Sed命令學習筆記

1 功能說明

    sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出或者加入i參數。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。linux

                            wKiom1cAecXClty8AABZUKW_ViE862.png

   小結:sed的功能是,對字符串進行增長、刪除、改變、查找,即增刪改查!正則表達式

2 語法格式

  sed [optian] [sed-command] [input-file]shell

 

  • 注意sed和後面的選項之間至少有一個空格。bash

  • 爲了不混淆,稱呼sedsed軟件。sed-commands(sed命令)sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令。編輯器

  • sed-commands既能夠是單個sed命令,也能夠是多個sed命令組合。ide

  • input-file(輸入文件)是可選項,sed還可以從標準輸入如管道獲取輸入。測試

3 經常使用選項

測試文本內容爲:spa

[root@lixin ~]# cat oldboy.txt
I am oldboy teacher!
I teach linux.
 
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
 
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
gd
good
gooood
[root@lixin ~]#

3.1 取消標準輸出

    -n:表示取消標準輸出(默認狀況下sed替換後會把文件全部內容包括更改過的內容一塊兒輸出到屏幕上,咱們使用-n後,讓它只輸出匹配表達式的字符串,通常和p連用,p表示print,打印表達式結果)。3d

[root@lixin ~]# sed '/old/p' oldboy.txt   
I am oldboy teacher!
I am oldboy teacher!
I teach linux.
 
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
 
not4900000448.
my god ,iam not oldbey,but OLDBOY!
my god ,iam not oldbey,but OLDBOY!
gd
good
gooood
[root@lixin~]# sed  -n '/old/p' oldboy.txt
I amoldboy teacher!
my blogis http://oldboy.blog.51cto.com
my god ,iam not oldbey,but OLDBOY!
[root@lixin~]#     //-n和p連用後表示只打印符合表達式規則的行


3.2 支持擴展正則表達式

   -r:參數用來支持擴展正則表達式,好比{}符號,若是不加-r參數須要使用\來進行轉意。orm

[root@lixin ~]# sed -n '/o\{1,2\}/p' oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
good
gooood
[root@lixin ~]# sed -nr '/o{1,2}/p' oldboy.txt   
I am oldboy teacher!
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
good
gooood
[root@lixin ~]# //表達式含義:o最少重複1次,最多重複2次


3.3 直接修改文件內容

   -i:表示直接對目標文件進行操做(增刪改查),加上這個參數以後,不會在屏幕上輸出信息,會直接對源文件進行更改(慎用)

[root@lixin ~]# sed -i '/^$/d' oldboy.txt  //直接刪除文件內的空行,並無打印。
[root@lixin ~]# cat oldboy.txt        
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
gd
good
gooood
[root@lixin ~]#

4 sed-command

測試文本內容爲:

[root@lixin ~]# cat study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

4.1 增長

  -i:表示插入,插入到目標行以前。

[root@lixin ~]# sed '2i she is a girl' study.txt
1,I am a Linux student
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#   //2i表示在第二行插入,不加行號表示在每一行以前插入


 

   -a:表示在目標行以後添加

[root@lixin ~]# sed  '3a he is a boy' study.txt 
1,I am a Linux student
2,I am studying Linux
3,I like movice
he is a boy
4,I am super man
5,I like computer games
[root@lixin ~]#

 

  多行增長

方法一:利用\n,表示換行符

[root@lixin ~]# sed '2i 1\n2\n3' study.txt
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

 

方法二:利用shell特性(\回車)表示接着下一行。

[root@lixin ~]# sed '2i 1\
> 2\
> 3 ' study.txt
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

4.1.1 限定區域添加

sed軟件能夠對單行或多行進行處理。若是在sed命令前面不指定地址範圍,那麼默認會匹配全部行。

用法:

n1[,n2]{sed-commands}

注:地址用逗號分隔的,n1,n2能夠用數字、正則表達式、或兩者的組合表示。

例子:

 n{sed-commands}        對第n行操做。

[root@lixin ~]# sed '5c she is a girl ' study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
she is a girl
[root@lixin ~]#     //表示針對第武行進行替換,替換爲she isa girl

n,m{sed-commands}     nm行操做,包括第n,m行。

[root@lixin ~]# sed '2,4c she is a girl ' study.txt
1,I am a Linux student
she is a girl
5,I like computer games
[root@lixin ~]#     //表示把2到4行替換成she is a girl。

n+m{sed-commands}   nn+m行操做,包括第n,m

[root@lixin ~]# sed '2,3d' study.txt
1,I am a Linux student
4,I am super man
5,I like computer games
[root@lixin ~]#         //表示2到3行刪除


 

 1~2{sed-commands}       1,3,5,7,……行操做

[root@lixin ~]# sed '2~2d' study.txt 
1,I am a Linux student
3,I like movice
5,I like computer games
[root@lixin ~]#         //表示對2,4,6,8等偶數行進行操做

n${sed-commands}     n到最後一行($表明最後一行)操做,包括第n

[root@lixin ~]# sed '2,$d' study.txt
1,I am a Linux student
[root@lixin ~]#         //刪除2行到$(尾行)

   

/Linux/{sed-commands}         對匹配oldboy的行操做

[root@lixin ~]# sed '/Linux/d' study.txt
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#     //表示把包涵Linux的行刪掉


   

/Linux/,/movice/{sed-commands}  對匹配oldboy的行到匹配Alex的行操做

[root@lixin ~]# sed '/Linux/,/movice/d'study.txt 
4,I am super man
5,I like computer games
[root@lixin ~]#         //表示把第一個包涵Linux到第一個包涵movice的行刪掉


   

/movice/,${sed-commands}       對匹配oldboy的行到最後一行操做

[root@lixin ~]# sed '/movice/,$d' study.txt
1,I am a Linux student
2,I am studying Linux
[root@lixin ~]#         //表示從movice到最後一行刪掉


 

/games/,10{sed-commands}      對匹配oldboy的行到第10行操做,注意:若是前10行沒有匹配到oldboysed軟件會顯示10行之後的匹配oldboy的全部行,若是有。

[root@lixin ~]# sed '/games/,4d' study.txt   
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
[root@lixin ~]#

 

1,/am/{sed-commands}         對第1行到匹配Alex的行操做

[root@lixin ~]# sed '1,/am/d' study.txt
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#      //表示從1行到第一個匹配到am的行刪除


   

/student/,+2{sed-commands}      對匹配oldboy的行到其後的2行操做

[root@lixin ~]# sed '/student/,+2d' study.txt
4,I am super man
5,I like computer games
[root@lixin ~]#         //表示從匹配student的第一項到它的後兩行進行刪除


4.2 刪除

  -d:表示刪除,能夠直接刪除行,能夠刪除包涵關鍵字的行

[root@lixin ~]# sed '2d' study.txt
1,I am a Linux student
3,I like movice
4,I am super man
5,I like computer games
games                         //刪除第2行
[root@lixin ~]# sed '/am/d' study.txt
3,I like movice
[root@lixin ~]#                //刪除包涵am的行


4.3 查找

    p表示打印,把符合咱們表達式的項目打印出來,因爲sed默認輸出全部,再使用拍的話會打印兩遍,因此通常和-n參數連用,表示只打印匹配到的行。

[root@lixin ~]# sed '/am/p' study.txt  //因爲沒有-n因此會把匹配到的行和默認輸出一塊兒打印
1,I am a Linux student
1,I am a Linux student
2,I am studying Linux
2,I am studying Linux
3,I like movice
4,I am super man
4,I am super man
5,I like computer games
5,I like computer games
games
games
[root@lixin ~]# sed -n '/am/p' study.txt    //-n取消默認輸出,p打印,因此只顯示匹配項
1,I am a Linux student
2,I am studying Linux
4,I am super man
5,I like computer games
games
[root@lixin ~]#
[root@lixin ~]# sed -n '2p' study.txt
2,I am studying Linux
[root@lixin ~]#          //只顯示第二行


4.4

-c:按行替換,表示一次替換一整行的內容。

[root@lixin ~]# sed '1c she is a girl' study.txt
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
games
[root@lixin ~]#       //表示把第1行,替換成she is a girl

 

4.4.1 文本替換

    s:表示全局查找某個關鍵字,並替換每行第一個匹配項。

    g:表示全局替換,不屬於sed命令,通常搭配s使用。

        

格式:

     sed  ‘s#1#2#g’

  • #:表示定界符,能夠是/@、或者其餘成對符號。

  • 1:表示要替換的源文件中的字符串(能夠是正則表達式)。

  • 2:表示要替換成的文件,必須是給定的字符串。

 

文本替換實例:

[root@lixin~]# !ca
cat study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]# sed '1s#a#b#' study.txt     //把第一個a替換爲b
1,I bm a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#
[root@lixin ~]# sed '1s#a#b#g' study.txt  //把第一行全部a替換爲b
1,I bm b Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

變量替換實例:

[root@lixin ~]# n=a        //設定變量n的值爲a
[root@lixin ~]# m=c       //設定變量m的值爲c
[root@lixin ~]# echo $n    //驗證變量n的值
a
[root@lixin ~]# echo $m   //驗證變量b的值
c
[root@lixin ~]# sed '1s#$n#$m#g' study.txt  //因爲’’單引號,不解釋內部變量值因此沒有替換
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]# sed "1s#$n#$m#g"study.txt  // 「」 雙引號表示引用內部的變量,因此替換了
1,I cm c Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]# //表示能夠利用變量的值來對字符串進行過濾或替換(必須用」」雙引號)


4.4.2 後向引用

    sed軟件的( )的功能能夠記住正則表達式的一部分,其中,\1爲第一個記住的模式即第一個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多能夠記住9個。這種在後面調用的方式,叫作後向引用。

格式:

     sed ‘s#()()#\1\2#g’

  • 第一個()表示第一項,第二個()表示第二項,一次類推,最多九個,不想匹配的能夠寫在括號後面。

  • \1表示引用前面第一個()括號內的內容,\2表示引用前面第二個()括號內的內容。

實例:

獲取ip地址信息

[root@lixin ~]# ifconfig eth0
eth0     Link encap:Ethernet  HWaddr00:0C:29:E4:83:06 
         inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:fee4:8306/64 Scope:Link
          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1
          RXpackets:981 errors:0 dropped:0 overruns:0 frame:0
          TXpackets:562 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RXbytes:85039 (83.0 KiB)  TX bytes:62853(61.3 KiB)
[root@lixin ~]# ifconfig eth0 | sed -nr'2s#^.*r:(.*).?B.*$#\1#gp'
10.0.0.8 
[root@lixin ~]#
// ^.*r: 表示以任意字符開頭到r:爲止。
//(.*) 表示任意字符,這裏就是咱們要取得ip信息。
//.?B.*$ ,.?表示匹配任意兩個字符,B.*$表示從B到結尾。


特殊符號的使用:

批量進行文件後綴名更改

[root@lixin lixin]# ls
LinuxAdministartor10.bak  LinuxAdministartor2.bak  LinuxAdministartor4.bak  LinuxAdministartor6.bak  LinuxAdministartor8.bak
LinuxAdministartor1.bak   LinuxAdministartor3.bak  LinuxAdministartor5.bak  LinuxAdministartor7.bak  LinuxAdministartor9.bak
[root@lixin lixin]# ls | sed -nr's#(^L.*[0-9])(.*$)#mv & \1.txt#gp'
mv LinuxAdministartor10.bakLinuxAdministartor10.txt
mv LinuxAdministartor1.bak LinuxAdministartor1.txt
mv LinuxAdministartor2.bak LinuxAdministartor2.txt
mv LinuxAdministartor3.bak LinuxAdministartor3.txt
mv LinuxAdministartor4.bak LinuxAdministartor4.txt
mv LinuxAdministartor5.bak LinuxAdministartor5.txt
mv LinuxAdministartor6.bak LinuxAdministartor6.txt
mv LinuxAdministartor7.bak LinuxAdministartor7.txt
mv LinuxAdministartor8.bak LinuxAdministartor8.txt
mv LinuxAdministartor9.bak LinuxAdministartor9.txt
[root@lixin lixin]# ls | sed -nr's#(^L.*[0-9])(.*$)#mv & \1.txt#gp' | bash
[root@lixin lixin]# ls
LinuxAdministartor10.txt  LinuxAdministartor2.txt  LinuxAdministartor4.txt  LinuxAdministartor6.txt  LinuxAdministartor8.txt
LinuxAdministartor1.txt   LinuxAdministartor3.txt  LinuxAdministartor5.txt  LinuxAdministartor7.txt  LinuxAdministartor9.txt
[root@lixin lixin]#
// &符號表示前面兩個分隔符中間的全部內容
//shell的命令都是bash在執行,因此把命令拼出來後直接交給bash處理便可
相關文章
相關標籤/搜索