Linux之Sed工具的使用詳解

Sed工具工作原理及特性

  • 1. sed是流編輯器蠢沿,每一次讀取一行到內存中吹泡,即稱之為模式空間(pattern space)
  • 2. 默認不修改原文件盟庞,如果需要修改需加-i參數
  • 3. sed有模式空間及保持空間(hold sapce),默認打印模式空間中的內容到標準輸出
  • 4. 默認情況下跃巡,模式空間中的內容打印一次危号,被模式匹配到的內容被命令動作處理過,一般情況下會再次打印 到標準輸出素邪,除非使用d選項外莲。
  • 5. sed讀取每行的時候會將內容保存至內存中
  • 6. 支持正則和擴展正則表達式,除-y選項

Sed命令

sed - ed - stream editor for filtering and transforming text
  • synopsis: sed [OPTION]... {script} [input-file]…
    • 常用格式: sed 選項 地址定界 編輯命令 文件

    • [Options]
      • -n : 不輸出模式空間中的內容至屏幕兔朦,即關閉不能被模式匹配到的行到標準輸出中
      • -e : 多項編輯一次執(zhí)行
      • -f FILE : FILE中每行是一個操作命令
      • -r : 支持擴展正則表達式
      • -i : 直接保存至原文件中
    • 地址定界常規(guī)方法
      • 1 空地址:即對全文進行處理
        • sed 's/root/ROOT/' /etc/passwd
      • 2 單地址:
        • # : 指定行
          • sed -n '1,5{/^#/p}' fstab
          • sed '1,+5{/^#/d}' fstab
        • /pattern/ : 被模式匹配到的每一行
          • sed '/^root/p' /etc/passwd
      • 3 地址范圍
        • #,# : 從#號行到#號行
          • sed '2,3d' /etc/fstab : 顯示除2到3行的所有行
        • #,+# : 從#號行向下#行
          • sed '2,+5d' /etc/fstab : 刪除2到5行
        • #,/pattern/ : 從#號行到被模式匹配到的行
          • sed '1,/^UUID/d' fstab1 : 刪除從第1行到被模式匹配到的第一個行的位置偷线,刪除
        • /pattern1/,/pattern2/ : 從模式1匹配到的行到被模式2匹配到的行
          • sed -n '/^[/]/p' fstab1 : 顯示為/開始的行
          • sed '/^#/d' fstab1 : 顯示開始為#號的行
        • $ : 表示最后一行
          • sed '$d' fstab1 : 刪除最后一行
      • 4 步進地址表示法:
        • 1~2: 所有奇數行
          • sed -n '1~2p' fstab1
        • 2~2: 所有偶數行
          • sed -n '2~2p' fatab1
    • sed編輯命令
      • d : 刪除模式空間中的內容
        • 示例:
          • sed '1,5d' FILE : 刪除1到5行的內容
          • sed '1~2d' FILE : 刪除奇數行,只顯示偶數行
      • p : 顯示被模式框定的內容
        • 示例:
          • sed '1~2p' FILE : 顯示奇數行沽甥,如果只需要顯示一次声邦,需要使用-n關閉默認模式空間的內容
          • sed -n '/./p' a.sh : 顯示非空行,但對制表符無效
      • P : 只顯示模式空間中的第一行
        • 示例:
          • seq 5 | sed -n 'N;P' : 顯示結果為1摆舟、3兩行
      • a \line : 追加line行至匹配到行的后面翔忽,如果是多行可使用\n實現多行追加
        • 示例:
          • sed '/^UUID/ a\line1\nline2' fstab :查找匹配到UUID開始的行,并在后面添加line1,line2兩行內容
      • i \line : 添加line行到匹配行的前面盏檐,如果是多行可使用\n實現多行添加
        • 示例:
          • sed '/^UUID/i \line1\nline2' fstab :查找匹配到UUID開始的行歇式,并在其前面增加line1,line2兩行內容
      • c \line : 把匹配到的行替換為line行
        • 示例
          • sed '/^UUID/c \newline' fstab1 : 匹配以UUID開始的行,并把其替換為newline行
      • w /PATH : 將模式空間匹配到的行胡野,寫入指定文件中
        • 示例
          • sed '/#/!w ./w.txt' fstab : 匹配非#開始的行材失,并寫入當前目錄下的w.txt文件中
      • r /PATH : 將PATH中指定的文件寫入匹配到的行下方,多用于文件合并硫豆。
        • 示例:
          • sed '/^UUID/r ./w.txt' fstab :把當前目錄下的w.txt文件寫入到以UUID開頭的行下
      • q : 退出sed,一般用于打印到第幾行即退出
        • 示例:
          • sed '10q' FILE : 只打印文件中的前10行龙巨,等同于sed -n '1,10p' FILE
      • y : 完成大小寫替換(等同于s///,基本不用)
        • sed '1,15y/UUID/uuid/' fstab1 :替換1到15行的內容UUID為uuid
        • sed 'y/UUID/uuid/' fstab1 : 替換全文每行中的第一個匹配到的
      • = : 匹配到的行笼呆,顯示一個行號,默認在其匹配到的行上方顯示對應的行號旨别,如果需要只顯示行號诗赌,需要加-n參數,把模式空間中的內容關閉顯示秸弛。
        • 示例
          • sed '/^UUID/=' fstab : 在匹配到UUID開頭的行上一行打印其行號
          • sed -n '$=' fstab : 顯示最后一行的行號铭若,一般可用于顯示文本的總行數。
          • sed '/./=' File : 顯示所有行的行號递览,但空行不顯示行號
      • ! : 條件取反叼屠,一般用于模式之后,命令之前
        • 示例
          • sed '/^#/!d' FILE : 只顯示非注釋的行
      • s/// : 字符替換查找绞铃,其分隔符可自動指定镜雨,常用的有,s@@@、s###儿捧。
        • 替換標記操作符
          • g : 全局替換荚坞,不加g只能每行開始的第一個匹配操作
            • 如果只想從第幾次開始替換,可使用3gNg(N代表一個數值)
          • w /PATH: 將替換成功的結果保存至指定文件中
          • p : 顯示替換成功的行
            • 示例
              • sed 's/UUID/uuid/' fstab : 將UUID替換為uuid
              • sed 's/love/& you' FILE: 將love替換為love you,&`表示對前面模式的引用
              • sed 's/^\(UUID\).*/\1 Hello/' fstab1 : 將UUID開頭的行替換為UUID Hello的內容
              • sed -n '1,15s/^UUID/uuid/gp' fstab : 查找1到15行以UUID開始的行菲盾,并將其替換為uuid西剥,并且只顯示被替換過的行
              • sed 's/.$//' File 將每行中最后一個字符刪除,.$代表每行的最后一個字符
      • h : 把模式空間中的內容覆蓋至保持空間中
      • H : 把模式空間中的內容追加至保持空間中
      • g : 把保持空間中的內容覆蓋至模式空間中
      • G : 把保持空間中的內容追加至模式空間中
      • x : 把模式空間中的內容到保持空間中的內容互換亿汞,初始保持空間中為空
      • n : 讀取下一行覆蓋模式空間中的行
        • seq 11 | sed 'n;d' : 顯示結果為1瞭空、3、5疗我、7咆畏、9、11 吴裤,默認動作先輸出模式空間中的行旧找,再覆蓋讀取下一行,再執(zhí)行d命令
        • seq 10 | sed 'n;d' : 顯示結果為1麦牺、3钮蛛、5、7剖膳、9
      • N : 讀取下一行并追加到模式空間中的行后面魏颓,使用\n分隔
        • seq 11 | sed 'N;d' : 顯示結果為11,默認動作先讀取兩行吱晒,然后執(zhí)行d操作
        • seq 10 | sed 'N;d' :顯示結果為空
      • D : 刪除模式空間中的多行
        • seq 11 | sed 'N;D' : 顯示結果為11
      • {} : 多命令同時執(zhí)行時甸饱,需要使用{}括起來
        • sed -n '/^UUID/{N;p}' fstab1 : 讀取UUID開始的行,再讀取下一行并打印模式空間的內容。

應用實例

  1. 替換文本中的字符串
    • echo "sksksksksksk" | sed 's/sk/SK/3g
      • 結果:skSKSKSKSKSK
  2. 定界符出現在樣式內部時叹话,需要進行轉義,建議更換定界符
    • sed 's/\/bin/\/usr\/local\/bin/g'
  3. 刪除指定的行
    • sed '2d' file : 刪除第二行
    • # sed '2,$d' file : 刪除第二行到最后一行
    • sed '$d' file : 刪除最后一行
    • sed '/^test/'d file : 刪除文件中以test開頭的行
  4. 正則表達式 \w+ 匹配每一個單詞偷遗,使用 [&] 替換它,& 對應于之前所匹配到的單詞
    • echo this is a test line | sed 's/\w\+/[&]/g'
      • 結果:[this] [is] [a] [test] [line]
  5. 所有以192.168.0.1開頭的行都會被替換成它自已加localhost
    • sed 's/^192.168.0.1/&localhost/' file
      • 結果:192.168.0.1localhost
  6. 替換digit 7的內容替換為 7

    • echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
      • this is 7 in a number
  7. love被標記為1驼壶,所有l(wèi)oveable會被替換成lovers氏豌,并打印出來

    • sed -n 's/\(love\)able/\1rs/p' file
  8. 所有在模板test和check所確定的范圍內的行都被打印

    • sed -n '/test/,/check/p' file
  9. 對于模板test和west之間的行,每行加上字符串aaa bbb

    • sed '/test/,/west/s/$/aaa bbb/' file
  10. 查找line1 到line2之間的所有aa bbb 替換為AA BBB

    • sed '/line1/,/line2/s/aa bbb/AA BBB/' test.sh
  11. 使用n;p打印奇數行和偶數行

    • sed -n 'p;n' test.txt #奇數行
    • sed -n 'n;p' test.txt #偶數行
    • sed -n '1~2p' test.txt #奇數行
    • sed -n '2~2p' test.txt #偶數行
  12. 匹配關鍵字并顯示后幾行

    • sed -n '/3/,$p' a.sh : 顯示第一次匹配到的3热凹,到最后一行輸出
    • sed -n '/3/,+2p' a.sh : 顯示第一次匹配到的3泵喘,到向下2行輸出

sed高級說明舉例說明

  • seq 4 | sed 'n;d'

      1
      3
    

說明:pattern space先讀入1,然后執(zhí)行到n碌嘀,把下一行2讀入pattern space中并覆蓋原本的1。然后pattern space中的內容(2)被刪除(d操作)歪架,所以打印出1\n3

  • seq 5 | sed 'n;d'

      1
      3
      5
    
  • seq 4 | sed 'N;d'

      Nothing
    

    說明:pattern space先讀入1股冗,然后執(zhí)行到N紧索,把下一行添加到當前的pattern space中裤园,pattern space內容為1\n2但骨,然后執(zhí)行d操作被刪除莉炉。接下去讀入3(系統讀入總是覆蓋原有內容)婆芦,執(zhí)行N岖圈,pattern space 內容變?yōu)?\n4食呻,然后再被刪除

  • seq 7 | sed ‘N;d’

      7
    
  • 理解nN

    • seq 4 | sed –n 'n'

        Nothing
      
    • `seq 4 | sed –n ‘N’

        Nothing
      

    以上兩都不會輸出輸入近范,-n參數把模式空間中的內容關閉顯示了

  • `seq 4 | sed –n 'n;p'

      2
      4
    

    說明:-n參數不顯示模式空間的內容催束,n讀取下一行并覆蓋模式空間的內容集峦,執(zhí)行p操作

  • seq 4 | sed –n 'N;p'

      1
      2
      3
      4
    

    說明:-n不顯示模式空間中的內容,N讀取1\n2行的內容抠刺,再p命令顯示模式空間中的內容

  • seq 5 | sed –n 'N;p

      1
      2
      3
      4
    

    說明:n首先讀取1\n2 -->打印模式空間 -->讀取3\n4--->打印模式空間--->讀取5行發(fā)現沒有第6行--->失敗

  • seq 5 | sed -n 'n;p'

      2
      4
    

    說明:模式空間中有1塔淤,然后n使用2覆蓋1,再p打印速妖,當執(zhí)行到第5行時高蜂,發(fā)現沒有下一行了,就不執(zhí)行n了

  • 理解 x

    • seq 11 | sed -n 'x;p' == seq 11 | sed 'x'

        [sapce line]
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
      

    說明:模式空間的1<--->保持空間的空白行-->打印模式空間的空行罕容,11并沒有打印出來备恤,因為他在保持空間中

    • seq 4 | sed '/3/{x;p;x}'
      1
      2

        3
        4
      

    說明:當匹配到3的時候,執(zhí)行交換锦秒,現在模式空間為空行露泊,保持空間中為3,執(zhí)行p命令顯示模式空間中的空行旅择,x再交換兩這空間的內容滤淳,此是模式空間為3,默認模式空間的就會輸出至標準屏幕,故3之前多了一個空行

    • seq 4 | sed '/3/{x;p;x;d}'

        1
        2
        
        4
      

    說明:當第二個x交換回來砌左,直接交給d執(zhí)行脖咐,故3就沒有了铺敌,只多了一條空行

  • 理解hH

    • seq 4 | sed 'h;x'

        1
        2
        3
        4
      

    說明:把模式空間中的內容覆蓋到保持空間,再交換屁擅,再打印至標準輸出

    • seq 4 | sed 'x;h'

        Nothing
      

    說明:先把模式空間的與保持空間交換偿凭,現在模式空間為空行,保持空間為1派歌,然后再把模式空間覆蓋保持空間弯囊,再輸出至標準輸出,故都為空行

  • 理解Gg

    • seq 4 | sed '/3/g'

      1
      2
      
      4
      

    說明:當匹配到3的時候胶果,把保持空間的空行覆蓋到模式空間匾嘱,故就輸出了空行

  • seq 3 | sed '1!;G'

    1
    2
    NULL
    3
    NULL
    

說明: 不是第1行就執(zhí)行G操作,G是追加保持空間到模式空間早抠,即為2+空行

  • seq 3 | sed '1!G;h;$!d'

    3
    2
    1

說明:當讀到第一行時G不操作霎烙,然后把模式空間的內容覆蓋到保持空間,然后刪除模式空間蕊连,此時悬垃,保持空間為1,當讀到第二行時甘苍,把保持空間的內容追加到模式空間尝蠕,此時模式空間為2\n1,再執(zhí)行h,把模式空間中的內容再覆蓋到保持空間载庭,此時保持空間為2\n1,刪除模式空間看彼,讀取第3行時,把保持空間的內容追加到模式空間中囚聚,此時模式空間的為3\n\2\n1,最后一行不執(zhí)行d操作

  • 實例

  • sed -n ’n;p’ file : 顯示偶數行

  • ed ‘1!G;h;$!d’ :逆序顯示內容

  • sed ‘$!d’ file :不是最后一行刪除闲昭,取出最后一行

  • sed ‘$!N;$!D’: 取出文件后兩行

  • sed ‘/^$/d;G’ FILE : 刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行

  • sed ’n;d’ FILE:顯示奇數行

  • sed ‘G’ /etc/issue: 在原有的每行后方添加一個空白行

本文借用網絡上的文檔編輯而成靡挥,感謝原作者序矩,如造成影響請通知將其刪除,此文用于學習sed工具的使用跋破,網絡地址如下:
http://www.1987.name/306.html; http://bbs.chinaunix.net/thread-3763371-1-1.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末簸淀,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子毒返,更是在濱河造成了極大的恐慌租幕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧簸,死亡現場離奇詭異劲绪,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門贾富,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉眷,“玉大人,你說我怎么就攤上這事颤枪『辜瘢” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵畏纲,是天一觀的道長扇住。 經常有香客問我,道長盗胀,這世上最難降的妖魔是什么艘蹋? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮票灰,結果婚禮上女阀,老公的妹妹穿的比我還像新娘。我一直安慰自己米间,他們只是感情好强品,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布膘侮。 她就那樣靜靜地躺著屈糊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琼了。 梳的紋絲不亂的頭發(fā)上逻锐,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音雕薪,去河邊找鬼昧诱。 笑死,一個胖子當著我的面吹牛所袁,可吹牛的內容都是我干的盏档。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼燥爷,長吁一口氣:“原來是場噩夢啊……” “哼蜈亩!你這毒婦竟也來了?” 一聲冷哼從身側響起前翎,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稚配,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后港华,有當地人在樹林里發(fā)現了一具尸體道川,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了冒萄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臊岸。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宦言,靈堂內的尸體忽然破棺而出扇单,到底是詐尸還是另有隱情,我是刑警寧澤奠旺,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布蜘澜,位于F島的核電站,受9級特大地震影響响疚,放射性物質發(fā)生泄漏鄙信。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一忿晕、第九天 我趴在偏房一處隱蔽的房頂上張望装诡。 院中可真熱鬧,春花似錦践盼、人聲如沸鸦采。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔伯。三九已至,卻和暖如春肄程,著一層夾襖步出監(jiān)牢的瞬間锣吼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工蓝厌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玄叠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓拓提,卻偏偏與公主長得像读恃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子代态,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,175評論 2 33
  • 本文承接之前寫的三十分鐘學會AWK一文寺惫,在學習完AWK之后,趁熱打鐵又學習了一下SED胆数,不得不說這兩個工具真的堪稱...
    mylxsw閱讀 4,401評論 3 74
  • 一肌蜻、sed命令介紹: 1、含義:Stream Editor文本流編輯必尼,sed是一個“非交互式的”面向字符流的編輯器...
    優(yōu)果馥斯閱讀 16,796評論 0 1
  • linux sed命令詳解 1. Sed簡介 sed 是一種在線編輯器蒋搜,它一次處理一行內容篡撵。處理時,把當前處理的行...
    很少更新了閱讀 2,164評論 0 6
  • 舊文豆挽,今日又看到育谬,感慨良多,我還好帮哈。 傷口是光進入你內心的地方膛檀。 “The wound is the place ...
    云朵里的小樹閱讀 270評論 0 0