原理
一行文本被讀到模式空間以後,首先會判斷模式空間的行是否能被你定義的模式所匹配到,如果能匹配到就對它做一次輸出操作,而後做編輯操作,如果不期望直接輸出模式空間的內容到屏幕可以加-n選項
文本處理三劍客:
grep, egrep, fgrep:文本過濾器
sed:Stream EDitor,流編輯器,行
awk:文本格式化工具,報告生成器
sed [OPTION]... 'script' file1 ...
script:
地址定界編輯命令
常用選項:
-n:不輸出模式空間中的內容至屏幕;
-e script, --expression=script:多點編輯;
-f /PATH/TO/SED_SCRIPT_FILE :每行一個編輯命令;
-r, --regexp-extended:支持使用擴展正則表達式;
-i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;
~]# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
地址定界:
(1) 空地址:對全文進行處理;
(2) 單地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址範圍
#,#:從第#行到第#行
#,+#:從第三行開始向下八行
#,/pat1/:從第#行開始,到第一次匹配到模式結束
/pat1/,/pat2/:從匹配到第一個模式開始,到匹配到第二個模式結束
$:最後一行;
(4) 步進:~
1~2:所有奇數行
2~2:所有偶數行
編輯命令:
d:刪除:(顯示未被匹配到的行)
例:sed '1,3d' /etc/fstab 顯示第四行到最後一行的所有內容
p:顯示模式空間中的內容;(帶來的結果是匹配到的行顯示兩次,-n可以靜默顯示,只顯示一遍)
例:sed '1,4p' /etc/fstab 顯示整個文本,並且1到4行顯示兩遍
a \text:在匹配到的行後面追加文本“text”,支持使用\n實現多行追加;
i \text:在匹配到的行前面插入文本“text”,支持使用\n實現多行插入;
例:sed '3i \new line' /etc/fstab 在第三行前面插入一個新行
sed '3a \new line \n another line' /etc/fstab 在第三行後面添加兩行分別是newline、anotherline
sed '/^UUID/a \# add new device base on UUID ' /etc/fstab 在每一個UUID行後加一個註釋行。
注意:a i 後面注意反斜線的存在 固定模式.
c \text:把匹配到的行替換爲指定的文本“text”;
例:sed '1,3c \test' /etc/fstab
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
例:sed -n '/^[^#]/w /tmp/fstab.new' /etc/fstab 把所有非#開頭的行保存至fstab.new文件中,並且在屏幕上只輸出一遍
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;
例:sed '3r /etc/issue' /etc/fstab 保存issue全文至fstab的第三行後面
=:爲模式匹配到的行打印行號;
例:sed '/^UUID/=' /etc/fstab 將被你條件所必配的行的下一行加個行號,比較詭異
!:條件取反;
例:sed '/^#/id' 將所有以#開頭的行取反
替換標記:
s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
練習1:刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
練習2:刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#後面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' /etc/fstab
練習3:輸出一個絕對路徑給sed命令,取出其目錄,其行爲類似於dirname;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@' 卯定路徑
註釋:行尾的非斜線字符,至少出現一次,後面可以跟一個或零個斜線;將這些替換爲空
~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
註釋:同上,使用了正則表達式
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;
示例:
sed -n 'n;p' FILE:顯示偶數行;
sed '1!G;h;$!d' FILE:逆序顯示文件的內容;
註釋:如果是第一行我們就不做G操作,如果是最後一行我們
sed ’$!d' FILE:取出最後一行;
註釋:不是最後一行就刪除
sed '$!N;$!D' FILE:取出文件後兩行;
註釋:不是最後一行就N;不是最後一行就D
sed '/^$/d;G' FILE:刪除原有的所有空白行,而後爲所有的非空白行後添加一個空白行;
sed 'n;d' FILE:顯示奇數行;
sed 'G' FILE:在原有的每行後方添加一個空白行;