sed介紹正則表達式
sed處理文本文件時,首先會被讀到末世空間中,而不會修改原文件。sed能夠對文本文件的全部進行操做,也能夠經過正則表達式進行匹配,使得sed能夠只處理模式空間中的被正則表達式匹配到行。vim
而後再判斷模式空間中的文本是否會被正則表達式匹配到,若是匹配到,就會對匹配到的文本作編輯操做,以後再將被編輯的文本和沒被編輯的文本一同輸出到標準輸出。ruby
若是模式空間沒有被正則表達式匹配到,直接將沒有被匹配到文本原樣輸出至標準輸出。bash
1: sed [選項] 腳本 文件
2:腳本組成:
地址定界
編輯命令
3: 經常使用的選項
-n:不輸出模式模式中的內容至屏幕,也就是不會將沒有匹配到的文本輸出到標準輸出,只是輸出編輯到的文本
-e 腳本:能夠指定多個腳本,實現屢次編輯
-f 腳本文件: 每一行一個編輯命令
-i:直接修改原文件
-r: 表示使用擴展的正則表達式
地址定界(與vim的末行模式相似)
(1)全文匹配:不須要給定地址,表示全文匹配,而vim須要給定%表示全文匹配
(2)單地址匹配:寫一個數字便可,例如:8表示匹配第8行
(3)多地址匹配:給定一個範圍,
例如:1,9 表示匹配第1行到第9行
例如:1,+2 表示匹配第一行到第三行
(4)模式匹配:
例如:/正則表達式/ 表示正則表達式匹配到的行
例如:1,/正則表達式/ 表示從第一行到正則表達式匹配到的行
(5)步長匹配
例如:1~2 表示全部奇數行
例如:2~2 表示全部偶數行
編輯命令 (與vim的末行模式相似)d命令是特例,須要特別注意,不能加-n選項
(1) d: 刪除,對應d命令來講,不要安裝sed的工做機制去理解,緣由是對應d命令而言,沒有匹配到的文本是不會輸出到標準輸出的。例如:下面的sed對yhy文件進行處理,不會將沒有匹配到文本的輸出至標準輸出,而是將編輯後的文本輸出到標準輸出
例如:
[root@7 ~]# cat yhy
111
222
333
444
[root@7 ~]# sed '1,3d' yhy
444
[root@7 ~]# sed '/^#/d' /etc/fstab # 刪除/etc/fstab文件中以#開頭的行
UUID=396430ca-28ec-4c44-8e8e-171c92800306 / xfs defaults 0 0
UUID=8e454dca-4ea4-416b-8234-0b0a4570ad6e /boot xfs defaults 0 0
UUID=64654a8f-23bc-45e6-8c9c-fbdc07538547 swap swap defaults 0 0
(2)p: 打印
# 必定要-n選項,若是不加-n那麼打印的行將會顯示兩遍
[root@7 ~]# sed -n '3,4p' /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Feb 6 21:08:54 2017
(3)a\字符串:在行後面追加字符串,支持使用\n實現多行追加
例如:sed '5a\new_line' /etc/fstab:表示在第五行後面,也就是第六行插入new_line字符串,其後的行一次向下移動
(4)i\字符串:在行前面插入字符串,支持使用\n實現多行插入
例如:sed '5i\new_line' /etc/fstab :表示在第5行插入new_line字符串,其後的行一次向下移動
(5)c\字符串:把匹配到的行替換爲字符串
例如:sed '3c\yhy' /etc/fstab 將第三行替換爲yhy字符串
(6)w 文件路徑:將匹配到的行重定向至指定的文件中
例如:sed '/^[^#]/w yhy.txt' /etc/fstab 將非井號開頭的行保存至yes.txt文件中
(7)r 文件路徑:讀取指定文件的內容插入到當前文件被匹配到的行處
例如: sed '3r /etc/issue' /etc/fstab 將/etc/issue中的內容插入到第3行的文本後面
(8)=:表示被模式匹配到的行上面加上一個行號
sed '/^UUID/=' /etc/fstab
(9)!:取反條件
例如:sed '/^#/!d' /etc/fstab 將不是以#好開頭的行刪除
(10)s///:查找替換,經常使用的有s@@@, s### ,
修飾符有:
g:全局替換,表示能夠替換一行中屢次匹配到的字符串。若是不加g,那麼只能替換一行中第一次出現的字符串
w 文件路徑:替換成功的結果保存至指定文件中
p :顯示替換成功的行
(三)sed練習ui
加上-n選項
,表示取消默認的輸出,其餘的編輯命令都不要加-n選項
sed 's/^[[:space:]]\+//' /etc/grub2.cfg
sed -r 's/^#[[:space:]]*//' /etc/fstab
echo "/var/log/messages" | sed -r 's#^.*/(.*)#\1#' 正確
echo "/var/log/messages" | sed -r 's/^.*/(.*)/\1/' 錯誤
echo "/var/log/messages" | sed 's/^.*\/\(.*\)/\1/' 正確, 不用擴展正則表達式
echo "/var/log/messasdfasdf/" | sed -r 's#(.*)/.*#\1#'